JUnit 4
- 單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證祝沸。在android中常將一個方法或者一個類作為一個最小可測試單元。
- JUnit 4是Android Testing Support Library庫中提供的用戶單元測試的一個框架越庇。在Android studio中可以直接使用罩锐。
本地單元測試 Local Unit Tests
- Local Unit Tests運行在本地開發(fā)環(huán)境的JVM上,不需要連接android設(shè)備悦荒,但是同時也無法測試使用了與android相關(guān)的API
的單元唯欣。 - Local Unit Tests測試用例的編寫主要依靠一些注解來進行已經(jīng)依靠assertxxx來斷言測試是否通過。
Junit 4注解
- @Before標注setup方法搬味,每個單元測試用例方法調(diào)用之前都會調(diào)用
- @After標注teardown方法境氢,每個單元測試用例方法調(diào)用之后都會調(diào)用
- @Test標注的每個方法都是一個測試用例
- @BeforeClass標注的靜態(tài)方法,在當前測試類所有用例方法執(zhí)行之前執(zhí)行
- @AfterClass標注的靜態(tài)方法碰纬,在當前測試類所有用例方法執(zhí)行之后執(zhí)行
- @Test(timeout=)為測試用例指定超時時間
斷言
- assertTrue(condition):condition為真pass萍聊,否則fail
- assertFalse(condition):condition為假pass,否則fail
- fail():直接fail
- assertEquals(expected, actual):expected equal actual pass悦析,否則fail
- assertSame(expected, actual):expected == actual pass寿桨,否則fail
實例
- 編寫測試用例
/**
* Created by jason on 2018/2/28.
*/
public class CalculationTest {
Calculation calculation;
@BeforeClass
public static void start() {
System.out.println("類運行時調(diào)用一次");
}
@AfterClass
public static void end() {
System.out.println("類結(jié)束時調(diào)用一次");
}
@Before
public void before() {
calculation = new Calculation();
System.out.println("每個test方法前都會調(diào)用");
}
@After
public void after() {
System.out.println("每個test方法結(jié)束都會調(diào)用");
}
@Test
public void add() throws Exception {
System.out.println("test add");
int r = calculation.add(2, 3);
Assert.assertEquals(5, r);
}
}
- 輸出
類運行時調(diào)用一次
每個test方法前都會調(diào)用
test add
每個test方法結(jié)束都會調(diào)用
類結(jié)束時調(diào)用一次
- 修改斷言使測試不通過
@Test
public void add() throws Exception {
System.out.println("test add");
int r = calculation.add(2, 3);
Assert.assertEquals(6, r);//修改為結(jié)果為6時測試通過
}
- 修改后輸出
類運行時調(diào)用一次
每個test方法前都會調(diào)用
test add
每個test方法結(jié)束都會調(diào)用
java.lang.AssertionError:
Expected :6
Actual :5
<Click to see difference>
...
- 修改add方法,添加由Android提供的API强戴,由于Local Unit Tests只能測試jdk提供的方法亭螟,所以應(yīng)該是會報錯的。
import static android.content.ContentValues.TAG;
/**
* Created by jason on 2018/2/28.
*/
public class Calculation {
public int add(int a , int b) {
Log.d(TAG, "add: ");
return a+b;
}
}
- 結(jié)果報錯
類運行時調(diào)用一次
每個test方法前都會調(diào)用
test add
每個test方法結(jié)束都會調(diào)用
java.lang.RuntimeException: Method d in android.util.Log not mocked. See http://g.co/androidstudio/not-mocked for details.
...
設(shè)備單元測試 Instrumented Unit Tests
- Instrumented Unit Tests需要連接安卓設(shè)備或者模擬器骑歹,與上面的本地單元測試相比预烙,自然是多了可以測試android的API。
- 在使用上相比本地單元測試該測試類必須以@RunWith(AndroidJUnit4.class) 注解作為前綴道媚。
- 相比Local Unit Tests 多了訪問設(shè)備信息扁掸、測試篩選功能。
訪問設(shè)備信息
我們可以使用 InstrumentationRegistry 類訪問與測試運行相關(guān)的信息最域。此類包括 Instrumentation對象谴分、目標應(yīng)用Context對象、測試應(yīng)用Context對象镀脂,以及傳遞到測試中的命令行參數(shù)牺蹄。
測試篩選
- @RequiresDevice:指定測試僅在物理設(shè)備而不在模擬器上運行。
- @SdkSupress:禁止在低于給定級別的 Android API 級別上運行測試薄翅。例如钞馁,要禁止在低于 18 的所有 API 級別上運行測試虑省,請使用注解 @SDKSupress(minSdkVersion=18)。
- @SmallTest僧凰、@MediumTest和@LargeTest:指定測試的運行時長以及運行頻率。
實例
- 編寫測試用例
@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion = 18)
public class ConfigTest {
private static String userId;
@Before
public static void initId() {
userId = "123456";
}
@Test
public void setUserId() throws Exception {
Context context = InstrumentationRegistry.getTargetContext();
Config.getInstance(context).setUserId(userId);
}
@Test
public void getUserId() throws Exception {
Context context = InstrumentationRegistry.getTargetContext();
String id = Config.getInstance(context).getUserId();
assertEquals(userId, id);
}
}
- 輸出
Testing started at 1:47 ...
02/28 01:47:20: Launching ConfigTest
$ adb push D:\androidproject\LocalUnitTest\app\build\outputs\apk\debug\app-debug.apk /data/local/tmp/com.jason.localunittest
$ adb shell pm install -t -r "/data/local/tmp/com.jason.localunittest"
pkg: /data/local/tmp/com.jason.localunittest
Success
$ adb push D:\androidproject\LocalUnitTest\app\build\outputs\apk\androidTest\debug\app-debug-androidTest.apk /data/local/tmp/com.jason.localunittest.test
$ adb shell pm install -t -r "/data/local/tmp/com.jason.localunittest.test"
pkg: /data/local/tmp/com.jason.localunittest.test
Success
Running tests
$ adb shell am instrument -w -r -e debug false -e class com.jason.localunittest.ConfigTest com.jason.localunittest.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests
Tests ran to completion.
整合自Android自動化測試--學(xué)習(xí)淺談系列文章