1.建立一個簡單的android應用
應用的界面如下,首先是兩個id分別爲value1和value2的輸入框用於輸入兩個數字,然後是兩個按鈕,分別用來實現兩個數的求和與求積操作,運算的結果在id爲result的文本框中顯示。
整個應用只有一個Activity,主要代碼如下:
- public class MainActivity extends Activity {
- protected static final String LOG_TAG =null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- final EditText value1 = (EditText) findViewById(R.id.value1);
- final EditText value2 = (EditText) findViewById(R.id.value2);
- final EditText result = (EditText) findViewById(R.id.result);
- Button addButton = (Button) findViewById(R.id.addValues);
- addButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- try {
- int val1 = Integer.parseInt(value1.getText().toString());
- int val2 = Integer.parseInt(value2.getText().toString());
- Integer answer = val1 + val2;
- result.setText(answer.toString());
- } catch (Exception e) {
- Log.e(LOG_TAG,"Failed to add numbers", e);
- }
- }
- });
- Button multiplyButton = (Button) findViewById(R.id.multiplyValues);
- multiplyButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- try {
- int val1 = Integer.parseInt(value1.getText().toString());
- int val2 = Integer.parseInt(value2.getText().toString());
- Integer answer = val1 * val2;
- result.setText(answer.toString());
- } catch (Exception e) {
- Log.e(LOG_TAG,"Failed to multiply numbers", e);
- }
- }
- });
- }
2.利用JUnit基於android的擴展,從eclipse中生成應用項目對應的測試項目
右擊Demo項目名稱,在彈出的菜單中依次選擇Android->New Test Project,如圖:
在彈出的對話框中進行設置,如下:
設置對應於Demo項目的測試項目名爲:DemoTest
選擇測試對象爲Demo項目:
隨後得到了針對Demo項目的基於JUnit在android上的擴展的單元測試框架:
3.在測試項目中編寫測試用例
首先在com.winston.demo.test包中新建一個測試用例,操作如下:
測試用例的設置如下:
其中,新建的測試用例名稱爲testCase1,父類爲junit.framework.TestCase,在隨後的源代碼中需要修改父類爲ActivityInstrumentationTestCase2。
另外可以勾選是否生成一些默認的代碼,其中:
setUp()用來執行測試執行之前的一些相關的準備工作,constructor其實就是構造函數,tearDown用來做測試收尾的回收工作。
測試用例的代碼如下,包含4個測試用例,分別用來測試兩個整數相加、帶浮點數的操作、帶負數的操作、兩個數相乘:
- package com.winston.demo.test;
- import android.test.ActivityInstrumentationTestCase2;
- import com.winston.demo.MainActivity; //被測試對象
- import com.winston.demo.R;
- import android.widget.EditText;
- public class testCase1 extendsActivityInstrumentationTestCase2<MainActivity> {
- private EditText result;
- @SuppressWarnings("deprecation")
- public testCase1() {
- super("com.winston.demo", MainActivity.class);
- }
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- MainActivity mainActivity = getActivity();
- result = (EditText) mainActivity.findViewById(R.id.result);
- }
- private static final String NUMBER_24 ="2 4 ENTER ";
- private static final String NUMBER_74 ="7 4 ENTER ";
- private static final String NUMBER_5_DOT_5 ="5 PERIOD 5 ENTER "; //PERIOD 小數
- private static final String NUMBER_NEG_22 ="MINUS 2 2 ENTER "; // -22
- private static final String ADD_RESULT ="98";
- private static final String ADD_DECIMAL_RESULT ="79.5";
- private static final String ADD_NEGATIVE_RESULT ="52";
- private static final String MULTIPLY_RESULT ="1776";
- public void testAddValues() { //兩個整數相加
- sendKeys(NUMBER_24);
- sendKeys(NUMBER_74);
- sendKeys("ENTER");
- String mathResult = result.getText().toString();
- assertTrue("Add result should be 98 " +ADD_RESULT +" but was "
- + mathResult, mathResult.equals(ADD_RESULT));
- }
- public void testAddDecimalValues() { //帶小數的相加操作
- sendKeys(NUMBER_5_DOT_5 + NUMBER_74 + "ENTER");
- String mathResult = result.getText().toString();
- assertTrue("Add result should be " +ADD_DECIMAL_RESULT +" but was "
- + mathResult, mathResult.equals(ADD_DECIMAL_RESULT));
- }
- public void testSubtractValues() { //負數
- sendKeys(NUMBER_NEG_22 + NUMBER_74 + "ENTER");
- String mathResult = result.getText().toString();
- assertTrue("Add result should be " +ADD_NEGATIVE_RESULT +" but was "
- + mathResult, mathResult.equals(ADD_NEGATIVE_RESULT));
- }
- public void testMultiplyValues() { //兩個整數相乘
- sendKeys(NUMBER_24 + NUMBER_74 +" DPAD_RIGHT ENTER"); //須到config.ini中啓用虛擬機的D_PAD,否則影響測試
- String mathResult = result.getText().toString();
- assertTrue("Multiply result should be " +MULTIPLY_RESULT +" but was "
- + mathResult, mathResult.equals(MULTIPLY_RESULT));
- }
- }
可以在虛擬機中檢測自動化測試的執行情況,選擇DemoTest項目執行:
可以用來檢測測試是否順利進行:
至此,完成了Demo項目的自動化單元測試。
4.用ant編譯一個覆蓋率統計版,運行並得到測試項目對於應用項目的代碼覆蓋率結果
cd到項目所在目錄(我的是C:\Users\winstonwu\workspace\Demo)
首先用ant更新一下Demo項目:
再用“update test-project”命令將測試項目DemoTest也轉換爲ant工程:
其中-m選項用來指定要測試的項目(這裏是Demo),-p選項用來指定測試項目(這裏是DemoTest)。
這樣就可以調用emma執行單元測試,並收集代碼覆蓋率信息了(當然前提是有安裝配置emma,我直接使用的google ADT,在路徑ADT\sdk\tools\lib下google已經事先整合了emma),cd到測試項目所在目錄,執行:
接着可以到路徑“DemoTest\bin\_files”下查找代碼覆蓋率的統計文件,是兩個html文件:
覆蓋率的統計數據包含了多個層次:包、源文件、類、方法、語句;
0.html是一個總體的統計,即包和源文件的覆蓋率結果如下:
1.html中是更爲詳細的覆蓋率統計,包括類、函數、語句:
精確到語句的覆蓋率:
emma的語句覆蓋統計結果中用3種顏色提示,綠色表示完全覆蓋,黃色表示不完全覆蓋,紅色表示未覆蓋。
可以看到,測試用例的執行沒有覆蓋到第53和54兩行的代碼。
此外,在路徑\DemoTest\bin下還可以找到代碼覆蓋率統計結果的xml、txt、html三種格式的文件。
參考文章:
http://emma.sourceforge.net/userguide/ar01s03.html
http://www.cnblogs.com/wufengxyz/archive/2011/11/24/2261797.html
http://www.51testing.com/?uid-315430-action-viewspace-itemid-222318