Download presentation
Presentation is loading. Please wait.
1
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4
2
Unit Test Why not popular? 編寫單元測試太浪費時間
程式碼已經可以跑了,幹嘛還要寫單元測試:但如果有新成員加入,可能在沒有測試單元下去更改程式碼,造成其他部份程式碼無法執行 這不是程式設計師的工作 黑箱 白箱
3
先期準備與目標 使用Eclipse開發Android專案 透過JUnit發現程式中的bug
透過JUnit測試Android中的Activity 透過JUnit辨識程序中的錯誤 在建立專案時就同時建立測試專案 針對已經存在的專案增加對應的測試專案
4
針對已經存在的專案 增加對應的測試專案 使用計算數字平方的專案 有Activity 有layout 有輸入 有輸出
5
Activity
6
public class BitoperatorActivity extends Activity {
TextView txv; EditText edt; Button bt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); edt=(EditText)findViewById(R.id.editText1); txv=(TextView)findViewById(R.id.textView1); bt=(Button)findViewById(R.id.button1); bt.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //TODO Auto-generated method stub txv.setText("" + operate(Integer.valueOf(edt.getText().toString()))); } }); public int operate(int a) { int x= a * a; return x;
7
activity_main.xml
8
New Android Test Project
1 2
9
3 4
10
第一眼看上去跟普通Project的結構似乎沒有什麼差異
對應的測試專案 有沒有發現還是有差異? 原專案
11
設定對應的測試程序
12
加入測試程序
13
android.test.ActivityInstrumentationTestCase2<T>
14
constructor setUp() 設定一些在測試工作前的資源及環境參數等
15
如果不行,則把參數全部取消
17
需要搭配AVD或實機來測試
18
測試失敗 因為沒有任何測試程序
19
測試成功 加入測試程序 只要以test開頭就可以
20
測試程序 public void testoperate(){
BitoperatorActivity act=new BitoperatorActivity(); int aInt=4; String c=String.valueOf(act.operate(aInt)); if(c.equals("25")){ Log.i("TEST_Result","測試成功"); }else{ Log.i("TEST_Result","測試失敗"); }
21
從log看結果 為何是error?
23
設定只看我有興趣的
25
測試另一個Activity BMI
26
針對已經存在的專案 增加對應的測試專案 使用計算BMI的專案 有Activity 有layout 有輸入 有輸出
27
專案右鍵Android ToolsNew TestProject
28
測試專案名稱
29
選擇被測試Project 選擇目標SDK
30
第一眼看上去跟普通Project的結構似乎沒有什麼差異
原專案 有沒有發現來是有差異? 對應的測試專案
31
設定對應的測試程序
32
測試專案package右鍵NewJunit TestCase
33
測試activity的Android的測試class
34
需要設定對象Activity
35
參數要拿掉
36
constructor setUp() 設定一些在測試工作前的資源及環境參數等
37
測試Activity是否正常?
38
Run
40
測試功能
41
一定要寫 測試計算BMI的按鈕功能
43
有多個測試要執行時
44
在原來測試中再加上其他test即可
46
測試中比較兩值
47
Assert.assertEquals
48
預期90,結果不是,所以錯誤
49
將測試程式放在原專案內
50
extends InstrumentationTestCase
51
程式碼
52
程式碼 private BMI bmi = null; EditText ed1; EditText ed2; Button bt1;
TextView tv1; //起始設定 @Override protected void setUp() { try { super.setUp(); } catch (Exception e) { e.printStackTrace(); } Intent intent = new Intent(); intent.setClassName("ctu.rcjao.helloandroid", BMI.class.getName()); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); bmi = (BMI) getInstrumentation().startActivitySync(intent); ed1=(EditText)bmi.findViewById(R.id.editText1); ed2=(EditText)bmi.findViewById(R.id.editText2); bt1=(Button)bmi.findViewById(R.id.button1); tv1=(TextView)bmi.findViewById(R.id.textView3);
53
程式碼 //測試程式 public void testbmi(){ bmi.runOnUiThread(new Runnable() {
public void run() { ed1.setText("70"); ed2.setText("171"); } }); //bt1.performClick(); getInstrumentation().runOnMainSync(new PerformClick(bt1)); Log.i("BMI",tv1.getText().toString());
54
程式碼 // 執行按鈕CLICK private class PerformClick implements Runnable {
Button btn; public PerformClick(Button button) { btn = button; } public void run() { btn.performClick();
55
MyAndroidProject does not specify a android. test
MyAndroidProject does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-library android.test.runner in its AndroidManifest.xml 執行有錯誤
56
AndroidManifest.xml需加入
放在Application內 <uses-library android:name="android.test.runner" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage=“PACKAGE名稱" android:label="Tests for My App" />
57
如果有出現 Warning: No instrumentation runner found for the launch, using android.test.InstrumentationTestRunner
58
使用方式
59
result
Similar presentations