介紹過了如何用intrumentation進行android單元測試,其實還有一種方法同樣可以,那就是利用AndroidTestCase來做單元測試,intrumentationTestCase和AndroidTestCase都是Junit.framwork.TestCase的子類,二者代表不用的方向。
如果想通過AndroidTestCase,大致可以通過以下幾個步驟實現:
1. 添加自己的test case code, 讓他們繼承自AndroidTestCase。
2. 定義自己的testSuite類,用來管理test cases.
3. 定義自己的testRunner,用來執行測試
下面首先來看一下這種方法所涉及到的android的類以及介面。
AndroidTestCase
Android test cases classes需要從這個類派生出來,而不再是從junit.framework.TestCase. 二者之間的最主要區別就是Android test cases提供了一個方法getContext()來擷取當前的上下文變數,這在android測試中很重要的,因為很多的android api都需要context。
AndroidTestCase主要成員:
setUp() //Sets up the fixture, for example, open a network connection.
tearDown() //Tears down the fixture, for example, close a network connection.
testAndroidTestCaseSetupProperly()
TestSuite (in package junit.package)
一個TestSuite就是一系列test case的集合。通過testsuite可以更好的來管理test case
TestSuite主要成員:
Void addTest (Test test) //Adds a test to the suite.
void addTestSuite(Class testClass) //Adds the tests from the given class to the suite
下面是一小段往test suite中添加test case的樣本:
TestSuite suite= new TestSuite(); suite.addTest(new MathTest("testAdd")); //Adds a test to the suite. suite.addTest(new MathTest("testDivideByZero"));或者可以通過addTestSuite()來添加:suite.addTestSuite(MathTest.class); TestListener (in package junit.framework)
這是一個 interface ,用來監聽測試進程
有以下4個Public Methods :
abstract void addError(Test test,Throwable t)
An error occurred.
abstract void addFailure(Test test,AssertionFailedError t)
A failure occurred.
abstract void endTest(Test test)
A test ended.
abstract void startTest(Test test)
A test started.
AndroidTestRunner
繼承自class junit.runner.BaseTestRunner,但是它沒有提供ui, 甚至來一個基於console的UI都沒有,所以,如果想要很好的查看測試結果的話,你需要自己來處理來自於test runner的callback 函數。一會可以通過例子示範一下
AndroidTestRunner主要方法:
SetTest();
runTest()
addTestListener()
setContext()
如果要使用AndroidTestRunner,需要在permission in manifest.xml中添加許可權:
<uses-library android:name="android.test.runner" />
最後,通過一個執行個體來示範一下:
1. 寫一個test case:
MathTest.java
package com.ut.prac;
import android.test.AndroidTestCase;
import android.util.Log;
public class MathTest extends AndroidTestCase {
protected int i1;
protected int i2;
static final String LOG_TAG = "MathTest";
public void setUp() {
i1 = 2;
i2 = 3;
}
public void testAdd() {
Log.d( LOG_TAG, "testAdd" );
assertTrue( LOG_TAG+"1", ( ( i1 + i2 ) == 5 ) );
}
public void testAndroidTestCaseSetupProperly() {
super.testAndroidTestCaseSetupProperly();
Log.d( LOG_TAG, "testAndroidTestCaseSetupProperly" );
}
}
2. 定義一個test suite類。
ExampleSuite.java
package com.ut.prac;
import junit.framework.TestSuite;
public class ExampleSuite extends TestSuite {
public ExampleSuite() {
addTestSuite( MathTest.class );
}
}