Android单元测试总结
2019-12-07 本文已影响0人
Fizzzzer
Android单元测试总结
一:依赖文件的引入
//主要是Java层面的单元测试
testImplementation 'junit:junit:4.12'
//Android层面的测试
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
//基于UI层面的测试
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
在创建工程的时候,基本上都默认引入了这三个文件了只需要在对应的文件夹下面写代码进行测试就可以了
二:测试类结构介绍
测试类中主要是通过注解来进行标识
一些常用注解介绍
-
@RunWith(AndroidJUnit4.class)
:标记在类上,表示该类是一个测试类 -
@Test
:标记在方法上,标记该类是一个测试案例 -
@BeforeClass
:标记在方法上,测试类里所有用例运行之前,运行一次这个方法。方法必须是public static void -
@AfterClass
:与BeforeClass对应 -
@Before
:在每个测试用例运行之前都运行一次。 -
@After
:与Before相对应 -
@Test
:指定该方法为一个测试用例方法,方法必须是public void
三:Assert
判断一个测试用例是否正确符合预期结果最主要的方法就是用assert(断言)主要的一些断言方法有以下这些
四:批量执行测试用例
有时候我们需要执行多个Test类的话,应该怎么办?其实Junit提供Suite注解,在测试的目录下创建一个空的Test类,然后在该类上添加如下注解就好了
- @RunWith(Suite.class)
- @Suite.SuiteClasses({A.class,B.class,C.class})
@RunWith(Suite.class)
@Suite.SuiteClasses({A.class,B.class,C.class})
public class TestMain {
}
然后直接运行这个TestMain这个类,就可以运行A、B、C类中的所有测试案例了
五:获取Android中的context
InstrumentationRegistry.getInstrumentation().getTargetContext();
六:异步线程处理
在进行测试用例中,有时候可能需要调用一些异步线程的API,需要通过回调后的结果来进行用例成功与否的判断,这个时候就需要是使用CountdownLatch这个类。具体可以参见CountDownLatch详细用法
下面是一段代码的示例用法
先对CountDownLatch进行初始化
CountDownLatch mLatch = new CountDownLatch(1);
这个构造方法传了一个1,表示这里有一个异步线程需要等待被执行完成
接下来就是CountDownLatch的使用
PushClient.getInstance(mContext).turnOnPush(new IPushActionListener() {
@Override
public void onStateChanged(int state) {
code = state;
mLatch.countDown();
}
});
try {
mLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
Assert.assertEquals(0,code);
七:参数化测试用例
有时候一个测试用例需要传入不同的参数,这种如果这种情况下每一种参数组合写一个调用方法就显得不是那么高大上,这个时候可以参数化测试用例
- 1,在测试类上添加
@RunWith(Parameterized.class)
的注解 - 2,添加构造方法,并将测试的参数作为其构造参数
- 3,添加获取构造参数集合的static方法,并在该方法上添加
@Parameters
注解 - 4,在测试用例中使用构造的成员变量,然后会逐步生成对应的数据来执行测试方法
示例代码:
@RunWith(Parameterized.class)
public class ParamsTest {
private int paramA;
private int paramB;
private int expectValue;
public ParamsTest(int paramA, int paramB, int expectValue) {
this.paramA = paramA;
this.paramB = paramB;
this.expectValue = expectValue;
}
@Parameterized.Parameters
public static Collection<Object[]> initData() {
return Arrays.asList(new Object[][]{
{0, 0, 0},
{1, 2, 5},
{5, 6, 7},
{89, 10, 11}
});
}
private int add(){
return paramA + paramB;
}
@Before
public void utilsTest(){
Log.e("Fizzer", "utilsTest: "+ "Fizzer");
}
@Test
public void TestAdd(){
Assert.assertEquals(expectValue,add());
}
}
参考文档: