閱讀988 返回首頁    go 京東網上商城


Android測試教程


一、 

測試項目

  

Android的編譯和測試工具需要測試項目組織符合預訂的結構:分別為Test case 類,Test case 包以及測試項目。

JUnit 為Android的測試的基礎,一般來說,一個JUint測試為一個用來測試一個應用某一部分的語句。 你可以將多個測試Test方法組織起來構成一個測試用例(Test case),多個測試用例可以構成Test Suites 。 每個Test方法相對獨立,一個測試類Test class包含一組相關的Test 或其它輔助方法。

在Android平台上,你可以使用測試工具調入Test Package和所要測試的應用,然後執行Test Runner來運行測試用例。

使用Eclipse ADT 工具創建測試項目的方法:

1. 在創建應用的同時創建測試項目,如下圖

選中Create a Test Project ,ADT自動為應用創建對應的測試項目

2. 導入已有的測試項目,並和被測試的應用關聯。

Android SDK 自帶ApiDemo,並帶有其對應的測試項目ApiDemos->Test. 打開ApiDemos->Test 的方法如下,首先是選中Build Target (比如Android 2.2),然後選擇Create project from existing sample, 從下拉列表中選擇ApiDemos ->Tests (注意你要先創建ApiDemos Android ApiDemos示例解析(1):創建ApiDemo示例

將ApiDemos->tests 和ApiDemos 關聯起來:

修改ApiDemos->tests 測試項目的屬性,在Java Build Path 的項目Projects 中添加ApiDemos

你最好使Eclipse 工具創建測試項目:

  • 自動為你的測試項目設置使用InstrumentationTestRunner 作為運行Test Package的Test Runner,測試項目必須使用InstrumentationTestRunner 或其子類做為Test Package的runner.
  • 為測試項目創建合適的項目名稱和測試包名稱,比如你需要測試的應用的包名稱為com.mydomain.myapp 則自動創建的測試包名為com.mydomain.myapp.test ,從測試包名可以很容易找到對應的應用程序包名稱。
  • 自動創建合適的build 文件,mainifest 文件和文件目錄結構。

建議使用的文件目錄結構可以如下所示:

MyProject/
—–AndroidManifest.xml
—–res/
——–… (resources for main application)
—–src/
——–… (source code for main application) …
—–tests/
———-AndroidManifest.xml
———-res/
————-… (resources for tests)
———-src/
————-… (source code for tests)


二、測試相關API

Android的測試框架相關的API主要定義在三個包中:

  • android.test 用於編寫Android測試用例
  • android.test.mock 定義了方便測試用的測試“樁”類
  • android.test.suitebuilder 運行測試用例的Test Runner類

Android 測試API 是基於JUnit 擴展而來,並添加了與Android平台相關的測試API。

JUnit

你可以直接使用JUnit中相關API編寫一些和平台無關的測試用例(基於TestCase), Android 測試API中提供了一個TestCase的子類AndroidTestCase ,可以用來編寫一些Android相關的對象的測試用例,AndroidTestCase 支持一些和平台相關的setup,teardown 以及setup 方法。

你也可以直接使用JUnit 的Assert 方法 顯示測試結果,這些Assert方法可以通過比較預期的值和實際的值,如果不同可以排除異常。Android 測試API擴展了一些Assert方法用於支持和Android平台相關的比較。

要注意的是,Android 測試API支持JUnit 3 代碼風格,而不支持JUnit 4 代碼風格,也隻能使用InstrumentationTestRunner 來運行測試用例。

Instrumentation

Android 的Instrumentation 提供了一些“鉤子”方法連接到Android操作係統中,可以獨立控製Android組件(Activity,Service等)的生命周期,並可以控製Android如何調用一個應用。

在通常情況下(普通的Android應用),Android的activity,Service等的生命周期是由
Android操作係統來控製的。 比如一個Activity 的生命周期開始於onCreate (由某個Intent激活),然後是onResume. 可以參見Android簡明開發教程五:Activities。 應用程序本身無法直接控製這些生命周期狀態的切換。但使用Instrumatation API時你可以直接調用這些方法。

Instrumentation API 也可以支持強製某個應用和另一個已經在運作的應用運行在同一個進程中,這在通常的情況下是不可能實現的。

使用Instrumentation API 你可以直接調用Activity或是Service的生命周期回調函數,從而可以讓你運行一步一步的運行Activity或是Service的生命周期函數。如下例顯示了如何使用Instrumentation API來測試Activity 保持和恢複State。

  1. // Start the main activity of the  
  2. // application under test  
  3. mActivity = getActivity();  
  4.    
  5. // Get a handle to the Activity object's  
  6. //main UI widget, a Spinner  
  7. mSpinner  
  8. = (Spinner)mActivity  
  9.  .findViewById(com.android.example.spinner.R.id.Spinner01);  
  10.    
  11. // Set the Spinner to a known position  
  12. mActivity.setSpinnerPosition(TEST_STATE_DESTROY_POSITION);  
  13.    
  14. // Stop the activity - The onDestroy()  
  15. //method should save the state of the Spinner  
  16. mActivity.finish();  
  17.    
  18. // Re-start the Activity - the onResume()  
  19. //method should restore the state of the Spinner  
  20. mActivity = getActivity();  
  21.    
  22. // Get the Spinner's current position  
  23. int currentPosition = mActivity.getSpinnerPosition();  
  24.    
  25. // Assert that the current position is the  
  26. //same as the starting position  
  27. assertEquals(TEST_STATE_DESTROY_POSITION, currentPosition);  


 

其中關鍵的一個方法是getActivity(),隻有調用getActivity()後被測試的activity才會啟動。此外Instrumentation API允許把測試項目和被測試的應用項目運行到同一個進程中,從而在測試代碼中可以直接調用被測試應用的方法和訪問其成員。

Test case 相關類

Android提供了多個由Testcase或Assert派生而來的子類以支持Android平台相關的setup,teardown 和其它輔助方法。

  • AndroidTestCase 為一Android平台下通用的測試類,它支持所有JUnit的Assert方法和標準的setUp 和tearDown 方法,並可以用來測試Android permission 。
  • 組件相關的測試類如測試activity, Content provider ,Service 相關的測試類,Android沒有提供單獨的用來測試BroadcastReceiver 的測試類,而是可以通過發送Intent對象來檢測Broadcast Receiver的反應結果來測試BroadcastReceiver。
  • ApplicationTestCase 可以用來測試Application 對象。
  • InstrumentationTestCase 如果你要使用Instrumentation API,那麼你必須使用InstrumentationTestCase或其子類。

Assertion classes

Android測試中可以使用JUnit中提供的Assert方法來顯示測試結果。除此之外,Testing API還提供了MoreAsserts 和ViewAsserts 類。其中MoreAsserts支持更多的比較方法包括RegEx(正則)比較等。ViewAsserts 可以用來校驗UI View。

Mock object classes

android.test.mock 包中定義一些測試“樁”類,如MockApplication,MockContentProvider ,MockContext,MockCursor, MockPackagManager等用例幫助測試。

後麵將具體介紹如何使用這些API來編寫測試用例。


三、測試項目HelloWorldTest

本例介紹創建一個測試項目的一般步驟和編寫測試用例的基本方法。

為簡單起見,創建一個HelloWorld應用,帶有一個Greeting類,其定義如下:

  1. public class Greeting {  
  2.  private String name;  
  3.    
  4.  public Greeting(String name){  
  5.  this.name=name;  
  6.  }  
  7.    
  8.  public String getGreetings(){  
  9.  return "Hello," +name;  
  10.  }  
  11.    
  12. }  


 

測試項目打算來測試這個Greeting 類的getGreetings的方法,比如說,創建Greeting(“World”) ,預期的getGreetings 的值應為”Hello,World”。我們可以使用JUnit框架來編寫一個測試用例。

這裏我們在創建HelloWorld的項目的同時創建一個測試項目,參見Android測試教程(3):測試項目

可以看到新創建的測試項目名稱為HelloWorldTest ,並在src 中創建了com.pstreets.demo.test 文件夾(和HelloWorld 應用的com.pstreets.demo 包相對應)。但src 還沒有任何代碼。

可以看到HelloWorldTest 屬性的Java Build Path-> Projects 中引用的Project為HelloWorld, 表示在HelloWorldTest 項目中可以引用HelloWorld 項目中的類。

然後在HelloWorldTest的src 的com.pstreets.demo.test 中添加一個AllTests.java,其定義如下:

  1. public class AllTests extends TestSuite {  
  2.    
  3.  public static Test suite() {  
  4.  return new TestSuiteBuilder(AllTests.class)  
  5.  .includeAllPackagesUnderHere()  
  6.  .build();  
  7.  }  
  8. }  

AllTests.java 一般可以不用修改的應用到大部分的測試項目中,如果有特殊需要,可以使用android.test.suitebuilder 的類定義那些Testcase 需要包含到最終的測試包(Test Suite)中.

定義了AllTests.java ,這個測試項目就基本完整了,也可以運行了,隻是還沒有定義任何測試用例(Test case) 。

這裏定義一個GreetingTest ,用於測試Greeting 類:

  1. public class GreetingTest extends TestCase {  
  2.    
  3.  Greeting greeting;  
  4.    
  5.  @Override  
  6.  public void setUp(){  
  7.  greeting=new Greeting("World");  
  8.    
  9.  }  
  10.    
  11.  @Override  
  12.  public void tearDown(){  
  13.    
  14.  }  
  15.    
  16.  public void testGetGreeting() {  
  17.  assertTrue(greeting.getGreetings()  
  18.  .compareToIgnoreCase("Hello,World")==0);  
  19.  }  
  20.    
  21. }  

其實對於與這個例子setUp和tearDown 不是必須的,如果多個TestCase 使用同一組測試數據,可以在setUp 中創建這些測試數據,JUnit 中運行每個TestCase 前會運行setUp ,運行TestCase 後會執行tearDown 。

JUnit 把以test開頭的方法作為一個實例,也可以使用annotation @Test 表示一個方法為測試方法。

GreetingTest 由TestCase 派生,因為這裏測試是一個普通Java類(和Android 平台無關),也可以使用AndroidTestCase 作為基類。

testGetGreeting 使用assertTrue 來檢測測試結果,預期的getGreetings()的值為”Hello,World” ,如果為true ,表示測試通過。

以Android JUint Test 的方式運行HelloWorldTest

運行HelloWorldTest 時,Android測試環境會自動啟動HelloWorld ,並在JUint 窗口顯示最終測試結果。

在開發應用過程中,可以一邊編寫應用,一邊編寫測試用例。


https://blog.csdn.net/column/details/mapdigittesting.html

最後更新:2017-04-02 16:48:06

  上一篇:go android怎樣調用@hide和internal API
  下一篇:go jdk安裝後為什麼要配置Path環境變量