emma for android

結合junit + ant + emma實現Android項目單元測試代碼覆蓋率統計

 

1.建立一個簡單的android應用

應用的界面如下,首先是兩個id分別爲value1和value2的輸入框用於輸入兩個數字,然後是兩個按鈕,分別用來實現兩個數的求和與求積操作,運算的結果在id爲result的文本框中顯示。


整個應用只有一個Activity,主要代碼如下:

  1. public class MainActivity extends Activity {  
  2.     protected static final String LOG_TAG =null;  
  3.    
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.activity_main);  
  8.          
  9.          final EditText value1 = (EditText) findViewById(R.id.value1);  
  10.          final EditText value2 = (EditText) findViewById(R.id.value2);  
  11.          final EditText result = (EditText) findViewById(R.id.result);  
  12.    
  13.          Button addButton = (Button) findViewById(R.id.addValues);  
  14.          addButton.setOnClickListener(new OnClickListener() {  
  15.                public void onClick(View v) {  
  16.                    try {  
  17.                        int val1 = Integer.parseInt(value1.getText().toString());  
  18.                        int val2 = Integer.parseInt(value2.getText().toString());  
  19.    
  20.                        Integer answer = val1 + val2;  
  21.                        result.setText(answer.toString());  
  22.                    } catch (Exception e) {  
  23.                        Log.e(LOG_TAG,"Failed to add numbers", e);  
  24.                    }  
  25.                }  
  26.    
  27.              
  28.           });  
  29.    
  30.            Button multiplyButton = (Button) findViewById(R.id.multiplyValues);  
  31.            multiplyButton.setOnClickListener(new OnClickListener() {  
  32.                public void onClick(View v) {  
  33.                    try {  
  34.                        int val1 = Integer.parseInt(value1.getText().toString());  
  35.                        int val2 = Integer.parseInt(value2.getText().toString());  
  36.    
  37.                        Integer answer = val1 * val2;  
  38.                        result.setText(answer.toString());  
  39.                    } catch (Exception e) {  
  40.                        Log.e(LOG_TAG,"Failed to multiply numbers", e);  
  41.                    }  
  42.                }  
  43.            });  
  44.     }  
  45.    


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個測試用例,分別用來測試兩個整數相加、帶浮點數的操作、帶負數的操作、兩個數相乘:

  1. package com.winston.demo.test;  
  2. import android.test.ActivityInstrumentationTestCase2;  
  3. import com.winston.demo.MainActivity; //被測試對象  
  4. import com.winston.demo.R;  
  5. import android.widget.EditText;  
  6.    
  7. public class testCase1 extendsActivityInstrumentationTestCase2<MainActivity> {  
  8.     private EditText result;  
  9.      
  10.     @SuppressWarnings("deprecation")  
  11.     public testCase1() {  
  12.         super("com.winston.demo", MainActivity.class);  
  13.     }  
  14.      
  15.     @Override  
  16.     protected void setUp() throws Exception {  
  17.         super.setUp();  
  18.    
  19.         MainActivity mainActivity = getActivity();  
  20.         result = (EditText) mainActivity.findViewById(R.id.result);  
  21.     }  
  22.    
  23.     private static final String NUMBER_24 ="2 4 ENTER ";  
  24.     private static final String NUMBER_74 ="7 4 ENTER ";  
  25.     private static final String NUMBER_5_DOT_5 ="5 PERIOD 5 ENTER ";  //PERIOD 小數  
  26.     private static final String NUMBER_NEG_22 ="MINUS 2 2 ENTER ";  // -22  
  27.     private static final String ADD_RESULT ="98";  
  28.     private static final String ADD_DECIMAL_RESULT ="79.5";  
  29.     private static final String ADD_NEGATIVE_RESULT ="52";  
  30.     private static final String MULTIPLY_RESULT ="1776";  
  31.    
  32.     public void testAddValues() {  //兩個整數相加  
  33.         sendKeys(NUMBER_24);  
  34.         sendKeys(NUMBER_74);  
  35.         sendKeys("ENTER");  
  36.          
  37.         String mathResult = result.getText().toString();  
  38.         assertTrue("Add result should be 98 " +ADD_RESULT +" but was "  
  39.                 + mathResult, mathResult.equals(ADD_RESULT));  
  40.     }  
  41.    
  42.     public void testAddDecimalValues() {  //帶小數的相加操作  
  43.         sendKeys(NUMBER_5_DOT_5 + NUMBER_74 + "ENTER");  
  44.         String mathResult = result.getText().toString();  
  45.         assertTrue("Add result should be " +ADD_DECIMAL_RESULT +" but was "  
  46.                 + mathResult, mathResult.equals(ADD_DECIMAL_RESULT));  
  47.     }  
  48.    
  49.     public void testSubtractValues() {  //負數  
  50.         sendKeys(NUMBER_NEG_22 + NUMBER_74 + "ENTER");  
  51.         String mathResult = result.getText().toString();  
  52.         assertTrue("Add result should be " +ADD_NEGATIVE_RESULT +" but was "  
  53.                 + mathResult, mathResult.equals(ADD_NEGATIVE_RESULT));  
  54.     }  
  55.      
  56.    
  57.     public void testMultiplyValues() {  //兩個整數相乘  
  58.         sendKeys(NUMBER_24 + NUMBER_74 +" DPAD_RIGHT ENTER");  //須到config.ini中啓用虛擬機的D_PAD,否則影響測試  
  59.         String mathResult = result.getText().toString();  
  60.         assertTrue("Multiply result should be " +MULTIPLY_RESULT +" but was "  
  61.                 + mathResult, mathResult.equals(MULTIPLY_RESULT));  
  62.     }  
  63. }  


可以在虛擬機中檢測自動化測試的執行情況,選擇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

http://blog.csdn.net/stevenhu_223/article/details/8298858

http://blog.csdn.net/weihan1314/article/details/8223836

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章