1. 程式人生 > >單元測試+記憶體、SD卡、SP讀寫+XmlPullParser

單元測試+記憶體、SD卡、SP讀寫+XmlPullParser

測試:
•測試的相關概念

1、根據是否知道原始碼分類:

黑盒測試: a - b - c 邊值測試 測試邏輯業務
白盒測試: 根據原始碼寫測試方法 或者 測試用例;

2、根據測試的粒度分類:

方法測試:寫完一個方法後就測試
單元測試:測試一個能夠獨立執行的業務邏輯單元;
整合測試:整體測試專案 聯調
系統測試:對整個系統進行測試

3、根據測試的暴力程度:

冒煙測試:高頻次的點選軟體
壓力測試:使用測試工具:LoadRunner、Jmeter

單元測試Junit:

•eclipse中的單元測試步驟:

1、寫一個業務類,寫一個業務方法:

public class CalcService {

public static int add(int x,int y){

return x+y;
}

}

2、寫一個測試類,寫一個測試方法,用來測試業務方法

public class CalcServiceTest extends AndroidTestCase{

public void testAdd(){
    int result = CalcService.add(4, 5);
    assertEquals(9, result);//斷言的作用:檢測執行結果和預期是否一致
  }

}

3、在清單檔案中新增測試需要的包


•Android studio中單元測試步驟:(注意在AS中跟在eclipse中單元測試大有區別:省去了在清單檔案中很多配置:指定指令集和要測試的應用包名,定義要使用的類庫。因為AS內部集成了單元測試)

1、建立一個業務類,一個業務方法

複製程式碼
1 package com.ahu.androidtest;
2
3 /**
4 * Created by ahu_lichang on 2017/3/17.
5 */
6
7 public class Utils {
8 public static int add(int i,int j){
9 return i+j;
10 }
11 }

複製程式碼

2、選中上面的業務類Utils,右鍵–>Go To ---->Test---->新建測試類(勾選上下面方框中的方法)—>OK
在這裡插入圖片描述

3、在生成的測試類UtilsTest中,邊寫自己想要的測試程式碼(背影部分程式碼是自己手動寫的!)

複製程式碼
1 package com.ahu.androidtest;
2
3 import org.junit.Test;
4
5 import static org.junit.Assert.*;
6
7 /**
8 * Created by ahu_lichang on 2017/3/17.
9 */
10 public class UtilsTest {
11 @Test
12 public void add() throws Exception {
13 System.out.println(“單元測試。。。”);
14 int result = Utils.add(4,5);
15 assertEquals(9,result);//斷言:檢測預期的結果和執行的結果是否一致
16 }
17
18 }

複製程式碼

4、最後右鍵測試類,執行這個類即可。

在這裡插入圖片描述
  5、執行結果

在這裡插入圖片描述

•把資料儲存到檔案

Android應用程式儲存資料的方式:

1、儲存到檔案
2、SQLite資料庫
3、內容提供者ContentProvider
4、sharedproferrences儲存資料
5、網路

/data/data/應用包名/info.txt

•從記憶體中讀寫檔案(先把資料寫入記憶體檔案中,在從記憶體檔案中讀取資料並顯示到介面上)

1、建立一個檔案,目錄data/data/<包名>/檔名(eclipse中和AS中的記憶體檔案的儲存目錄一樣)
2、建立一個檔案輸出流,把資料寫到檔案上
3、關閉輸出流。

4、讀取檔案中的資料,並顯示到介面上

複製程式碼
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android
3 xmlns:tools=“http://schemas.android.com/tools
4 android:id="@+id/activity_main"
5 android:layout_width=“match_parent”
6 android:layout_height=“match_parent”
7 android:paddingBottom="@dimen/activity_vertical_margin"
8 android:paddingLeft="@dimen/activity_horizontal_margin"
9 android:paddingRight="@dimen/activity_horizontal_margin"
10 android:paddingTop="@dimen/activity_vertical_margin"
11 tools:context=“com.example.ahu_lichang.myapplication.MainActivity”
12 android:orientation=“vertical”
13 >
14
15 <EditText
16 android:id="@+id/et_name"
17 android:layout_width=“match_parent”
18 android:layout_height=“wrap_content”
19 android:hint=“請輸入使用者名稱”
20 />
21 <EditText
22 android:id="@+id/et_pass"
23 android:layout_width=“match_parent”
24 android:layout_height=“wrap_content”
25 android:inputType=“textPassword”
26 android:hint=“請輸入密碼”
27 />
28 <RelativeLayout
29 android:layout_width=“match_parent”
30 android:layout_height=“wrap_content”
31 android:orientation=“horizontal”
32 >
33 <CheckBox
34 android:id="@+id/cb"
35 android:layout_width=“wrap_content”
36 android:layout_height=“wrap_content”
37 android:text=“記住使用者名稱和密碼”
38 android:layout_centerVertical=“true”
39 />
40 <Button
41 android:layout_width=“wrap_content”
42 android:layout_height=“wrap_content”
43 android:layout_gravity=“right”
44 android:text=“登入”
45 android:layout_alignParentRight=“true”
46 android:onClick=“login”
47 />
48
49
50

複製程式碼

複製程式碼
1 package com.example.ahu_lichang.myapplication;
2
3 import android.os.Bundle;
4 import android.support.v7.app.AppCompatActivity;
5 import android.view.View;
6 import android.widget.CheckBox;
7 import android.widget.EditText;
8 import android.widget.Toast;
9
10 import java.io.BufferedReader;
11 import java.io.File;
12 import java.io.FileInputStream;
13 import java.io.FileOutputStream;
14 import java.io.InputStreamReader;
15 /**
16 * 在記憶體中讀寫檔案中資料
17 /
18 public class MainActivity extends AppCompatActivity {
19 private EditText et_name;
20 private EditText et_pass;
21 @Override
22 protected void onCreate(Bundle savedInstanceState) {
23 super.onCreate(savedInstanceState);
24 setContentView(R.layout.activity_main);
25
26 et_name = (EditText) findViewById(R.id.et_name);
27 et_pass = (EditText) findViewById(R.id.et_pass);
28
29 readAccount();
30
31 }
32
33 /
*
34 * 從記憶體檔案中讀取資料
35 /
36 public void readAccount(){
37 File file = new File(“data/data/com.example.ahu_lichang.myapplication/info.txt”);//Tools->ADM->DDMS,在裡面的檔案瀏覽裡能找到
38 if(file.exists()){
39 try {
40 FileInputStream fis = new FileInputStream(file);
41 //把位元組流轉換成字元流
42 BufferedReader br = new BufferedReader(new InputStreamReader(fis));
43 //讀取txt檔案裡的使用者名稱和密碼
44 String text = br.readLine();
45 String[] s = text.split("##");
46
47 et_name.setText(s[0]);
48 et_pass.setText(s[1]);
49 } catch (Exception e) {
50 e.printStackTrace();
51 }
52 }
53 }
54 /
*
55 * 先登入,將name和pass儲存在記憶體中
56 */
57 public void login(View v){
58
59 String name = et_name.getText().toString();
60 String pass = et_pass.getText().toString();
61
62 CheckBox cb = (CheckBox) findViewById(R.id.cb);
63 //判斷選框是否被勾選
64 if(cb.isChecked()){
65 //data/data/com.ahu.androidtest:這就是內部儲存空間的路徑
66 File file = new File(“data/data/com.example.ahu_lichang.myapplication/info.txt”);
67 FileOutputStream fos;
68 try {
69 fos = new FileOutputStream(file);
70 fos.write((name + “##” + pass).getBytes());
71 fos.close();
72 } catch (Exception e) {
73 e.printStackTrace();
74 }
75 }
76
77 //建立並顯示吐司對話方塊
78 Toast.makeText(this, “登入成功”, 0).show();
79 }
80 }

複製程式碼

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
讀寫SD卡中的檔案(重點—Android studio實現)

注意:SD卡路徑變化:
◦sdcard:2.3之前的
◦mnt/sdcard:4.3之前的
◦storage/sdcard:4.3之後的

1、必須先要建立虛擬SD卡檔案映象,然後新增到AVD中(或者用命令讓指定模擬器在啟動時增加虛擬SD卡映象檔案)。

1)、在Android studio使用mksdcard命令建立SD卡映象檔案:

adb shell

mksdcard 64M D:\sdcard.img -----在D:\目錄下建立了一個64M大小的虛擬SD卡

2)、將SD卡映象檔案新增到模擬器中:

第一種方式:直接在建立AVD的時候,就想已有的SD卡映象檔案新增到模擬器中

第二種方式:使用命令讓指定模擬器在啟動時就新增SD卡映象檔案 emulator -avd AVD5.1 -sdcard D:\sdcard.img

2、在SD卡上先寫入檔案,然後在讀取裡面的資料顯示在介面上

View Code

View Code
  3、新增許可權:(在Android studio中讀寫SD卡上檔案要新增建立與刪除檔案許可權、寫入資料許可權,不需要讀許可權。eclipse中則是要新增讀許可權、寫許可權)

View Code

•獲取SD的大小及可用空間

View Code

•檔案的許可權概念

檔案的4種操作模式:
Context.MODE_PRIVATE:為預設操作模式,代表該檔案是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容,如果想把新寫入的內容追加到原檔案中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該檔案。

MODE_WORLD_READABLE:表示當前檔案可以被其他應用讀取;MODE_WORLD_WRITEABLE:表示當前檔案可以被其他應用寫入。

如果希望檔案被其他應用讀和寫,可以傳入: 

openFileOutput(“itcast.txt”, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,當應用程式(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如檔案的時候,就需要userid匹配。預設情況下,任何應用建立的檔案,sharedpreferences,資料庫都應該是私有的(位於/data/data//files),其他程式無法訪問。除非在建立時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程式才能正確訪問。

•SharedPreferences儲存方式(重點)

在SharedPreferences中檔案讀寫資料:

View Code

•使用StringBuffer拼接字串完成簡訊備份

View Code

View Code

•使用序列化器生成一個xml檔案,完成簡訊備份

View Code

簡訊備份完成後,將SD卡中的xml檔案pull出來,然後用瀏覽器開啟該檔案,就能很清晰的看見如下結果:

•使用pull解析xml格式的資料 (重要-AS實現)

注意:1、Android studio和eclipse中的資原始檔的存放位置不一樣

2、Android studio中獲取資原始檔的方法跟eclipse中不一樣

先在main目錄下新建資料夾assets,然後再將資原始檔weather.xml。

View Code

編寫要用到的javabean,City.java

View Code
  佈局檔案

View Code

最後編寫用XmlPullParser解析XML檔案的具體程式碼

View Code

執行結果