JUnit 4
- 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在android中常将一个方法或者一个类作为一个最小可测试单元。
- JUnit 4是Android Testing Support Library库中提供的用户单元测试的一个框架。在Android studio中可以直接使用。
本地单元测试 Local Unit Tests
- Local Unit Tests运行在本地开发环境的JVM上,不需要连接android设备,但是同时也无法测试使用了与android相关的API
的单元。 - Local Unit Tests测试用例的编写主要依靠一些注解来进行已经依靠assertxxx来断言测试是否通过。
Junit 4注解
- @Before标注setup方法,每个单元测试用例方法调用之前都会调用
- @After标注teardown方法,每个单元测试用例方法调用之后都会调用
- @Test标注的每个方法都是一个测试用例
- @BeforeClass标注的静态方法,在当前测试类所有用例方法执行之前执行
- @AfterClass标注的静态方法,在当前测试类所有用例方法执行之后执行
- @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("类运行时调用一次");
}
@AfterClass
public static void end() {
System.out.println("类结束时调用一次");
}
@Before
public void before() {
calculation = new Calculation();
System.out.println("每个test方法前都会调用");
}
@After
public void after() {
System.out.println("每个test方法结束都会调用");
}
@Test
public void add() throws Exception {
System.out.println("test add");
int r = calculation.add(2, 3);
Assert.assertEquals(5, r);
}
}
- 输出
类运行时调用一次
每个test方法前都会调用
test add
每个test方法结束都会调用
类结束时调用一次
- 修改断言使测试不通过
@Test
public void add() throws Exception {
System.out.println("test add");
int r = calculation.add(2, 3);
Assert.assertEquals(6, r);//修改为结果为6时测试通过
}
- 修改后输出
类运行时调用一次
每个test方法前都会调用
test add
每个test方法结束都会调用
java.lang.AssertionError:
Expected :6
Actual :5
<Click to see difference>
...
- 修改add方法,添加由Android提供的API,由于Local Unit Tests只能测试jdk提供的方法,所以应该是会报错的。
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;
}
}
- 结果报错
类运行时调用一次
每个test方法前都会调用
test add
每个test方法结束都会调用
java.lang.RuntimeException: Method d in android.util.Log not mocked. See http://g.co/androidstudio/not-mocked for details.
...
设备单元测试 Instrumented Unit Tests
- Instrumented Unit Tests需要连接安卓设备或者模拟器,与上面的本地单元测试相比,自然是多了可以测试android的API。
- 在使用上相比本地单元测试该测试类必须以@RunWith(AndroidJUnit4.class) 注解作为前缀。
- 相比Local Unit Tests 多了访问设备信息、测试筛选功能。
访问设备信息
我们可以使用 InstrumentationRegistry 类访问与测试运行相关的信息。此类包括 Instrumentation对象、目标应用Context对象、测试应用Context对象,以及传递到测试中的命令行参数。
测试筛选
- @RequiresDevice:指定测试仅在物理设备而不在模拟器上运行。
- @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自动化测试--学习浅谈系列文章