Android 开发 单元测试 (套件,参数化,超时)
1. 套件测试
概念 : 测试套件是指测试不同的测试类的用例,当测试类很多的时候,可以使用@RunWith和@Suite注解把需要运行的测试类用例在一起运行,
@RunWith
: 这个是指定使用的单元测试默认执行类@ Suite.SuiteClasses
:定义测试类,将被列入执行,并按顺序执行
假设我们现在有两个测试类
SuiteTest1.java
/**
* Created by TiaoPi on 2017/11/23.
*/
public class SuiteTest1 {
@Test
public void testAdd() throws Exception{
JUnitTest jUnitTest = new JUnitTest();
int testAdd = jUnitTest.testAdd(1, 2);
assertEquals(3,testAdd);
// assertEquals("测试得到的结果是不是" +testAddNum + 1 ,testAddNum + 6,testAdd);
}
}
SuiteTest2.java
/**
* Created by TiaoPi on 2017/11/23.
*/
public class SuiteTest2 {
@Test
public void testAdd2() throws Exception{
JUnitTest jUnitTest = new JUnitTest();
int testAdd = jUnitTest.testAdd(2, 2);
assertEquals(4,testAdd);
}
}
我们创建测试套件
SuiteTest.java
/**
* Created by TiaoPi on 2017/11/23.
*/
@RunWith(Suite.class)
@Suite.SuiteClasses({ SuiteTest1.class, SuiteTest2.class })
public class SuiteTest {
}
我们执行
a75b2146-3c1d-43c0-a099-9889a87122bc.png
2. 参数化测试
参数化测试: 参数化测试允许开发人员使用不同的值反复运行同一个测试
创建参数化测试的五个步骤
- 用 @RunWith(Parameterized.class) 来注释 test 类。
- 创建一个由 @Parameters 注释的公共的静态方法,它返回一个对象( java.util.Collection)的集合(数组)来作为测试数据集合。并在此方法中初始化所有需要测试的参数对.
- 为每一列测试数据创建一个实例变量。
- 为测试类声明一个带有参数的公共构造函数,并在其中声明的几个变量赋值。
- 用实例变量作为测试数据的来源来创建你的测试用例。
按照步骤开始
假设我们现在有这样一个方法要测试
public Boolean parametersTest (int num){
if (num % 2 == 0) {
return true;
}else {
return false;
}
}
按照步骤开始写参数化测试
/**
* Created by TiaoPi on 2017/11/23.
*/
//1.测试类指定特殊的运行器org.junit.runners.Parameterized
@RunWith(Parameterized.class)
public class ParameterizedTest {
JUnitTest jUnitTest;
// 2.为测试类声明几个变量,分别用于存放期望值和测试所用数据。
int num;
Boolean testResult;
@Before
public void setup() {
jUnitTest = new JUnitTest();
}
//3.为测试类声明一个带有参数的公共构造函数,并为声明需要的几个变量赋值。
public ParameterizedTest(int num,Boolean testResult){
this.num = num;
this.testResult = testResult;
}
//4.为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为
// java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对。
@Parameterized.Parameters
public static Collection primeNumbers() {
return Arrays.asList(new Object[][] {
{ 1, false },
{ 2, true },
{ 3, false },
{ 4, true },
{ 5, false }
});
}
//5.编写测试方法,使用定义的变量作为参数进行测试
@Test
public void testResult () throws Exception{
Log.d("执行测试" + num,num + " ----" + testResult);
assertEquals(testResult,jUnitTest.parametersTest(num));
}
}
测试通过
4bcc2dbb-cc82-401d-ae7d-3d1963a2a6fc.png
3.时间测试
Junit 提供了一个暂停的方便选项。如果一个测试用例比起指定的毫秒数花费了更多的时间,那么 Junit 将自动将它标记为失败。timeout 参数和 @Test 注释一起使用。
直接看代码
假设我们又这样一个方法需要测试
public String timeTest(){
try {
Thread.sleep(5000);
return "OK";
} catch (InterruptedException e) {
return "FAIL";
}
}
我们进行测试
/**
* 时间测试 超过一秒 直接失败
*/
@Test(timeout = 1000)
public void testTime() throws Exception {
assertEquals("OK",jUnitTest.timeTest());
}
执行会出现这样的错误
org.junit.runners.model.TestTimedOutException: test timed out after 1000 milliseconds