简介
本文基于Junit4.12版本,记录Junit的基本使用以及常见的API说明。
- 版本说明
- 基本依赖
- 基本使用
- 相关注解
- 断言API
版本说明
- Junit版本(4.12)
- Android Studio 3.0+
- Android SDK 26
基本依赖
- 在Module的build.gradle文件中
dependencies {
testImplementation 'junit:junit:4.12'
}
- 现在默认创建一个Module会自动添加依赖
基本使用
-
编写Test用例的位置
基于Project目录的Test Location
-
androidTest目录和test目录的区别
目录 用途 需要模拟器或者真机? androidTest 一般用于UI层测试 是 test 一般用于单元功能测试 否 -
一个基础的测试类
Base Test
- 测试类命名:xxxTest , 如果项目测试类过多记得根据业务来分包
- 标记了@Test注解的方法,即为测试方法,左边也会出现一个运行按钮
- ExampleUnitTest类左边的按钮表示运行这个类所有的被@Test标记的方法
-
运行测试用例
Run Test
-
3种运行方法
- 运行测试用例
- debug运行测试用例
- 测试用例的覆盖率
-
测试成功
Test Success -
测试失败
- 修改代码
@Test public void addition_isCorrect() { assertEquals(4, 3 + 2); }
-
结果
Test Failed - 失败了这里控制台会告诉你,测试预期的结果是4,而实际的结果是5,所以导致失败。不通过的代码位于类的15行
-
3种运行方法
相关注解
-
目录
- @Test
- @After
- @AfterClass
- @Before
- @BeforeClass
- @Ignore
- @FixMethodOrder
- @Rule
-
@ClassRule
...
-
@Test
- 标记该方法为测试方法
- 被修饰的方法需要是public void
- 支持2种可选参数
-
expected
- 表示预测到了相关的异常,测试异常不会影响测试结果
@Test(expected = IndexOutOfBoundsException.class)//抛出数组越界异常,也表示测试可以通过 public void outOfBounds() { new ArrayList().get(1); }
-
timeout
- 表示到达指定的时间,还没执行完毕,则测试结果为失败
@Test(timeout = 100) public void sleep100() throws InterruptedException { Thread.sleep(100); }
-
expected
-
@After
- 用于释放在@Before修饰的方法中初始化的资源
- 在@Test修饰的方法之后执行
- 即使在@Before或者@Test中,抛出异常。@After修饰的方法也会执行
- 修饰 public void 方法
-
@AfterClass
- 用于释放在@BeforeClass修饰的方法中初始化的高成本资源
- 即使在@BeforeClass中,抛出异常。@AfterClass修饰的方法也会执行
- 修饰 public static void 方法
-
@Before
- 初始化资源
- 在@Test修饰的方法之前执行
- 修饰 public void 方法
-
@BeforeClass
- 初始化成本比较高的资源
- 修饰 public static void 方法
-
执行顺序
public class ExampleUnitTest {
@BeforeClass
public static void beforeClass(){
System.out.println("@BeforeClass");
}
@Before
public void setUp(){
System.out.println("@Before");
}
@Test
public void addition_isCorrect() {
System.out.println("@Test");
}
@After
public void tearDown(){
System.out.println("@After");
}
@AfterClass
public static void afterClass(){
System.out.println("@AfterClass");
}
}
-
控制台结果
执行顺序 -
@Ignore
- 表示测试的时候忽略该方法
- 可以添加自己的说明
@Ignore("暂时忽略该方法") @Test public void addition_isCorrect() { System.out.println("@Test"); assertEquals(4, 2 + 2); }
-
@FixMethodOrder
- 允许用户选择测试类中测试方法的执行顺序
@FixMethodOrder(MethodSorters.NAME_ASCENDING)//按照方法名排序 public class ExampleUnitTest { }
-
MethodSorters.NAME_ASCENDING
- 根据方法名称,按字母排列
-
MethodSorters.JVM
- 根据JVM的顺序(代码编写顺序),JVM的顺序可能因运行而异
-
MethodSorters.DEFAULT
- 以确定但不可预期的顺序执行
-
MethodSorters.NAME_ASCENDING
- 允许用户选择测试类中测试方法的执行顺序
-
@Rule
-
@ClassRule
断言API
-
assertTrue 断言条件为真
- assertTrue(boolean condition)
- assertTrue(String message, boolean condition)
- message 断言失败以后的标识消息
- condition 待检查条件
-
assertFalse 断言条件为假
- assertFalse(boolean condition)
- assertFalse(String message, boolean condition)
-
fail 指定测试失败
- fail(String message)
- fail()
-
assertEquals 断言2个对象相等
- assertEquals(String message, Object expected,Object actual)
-
assertEquals(Object expected, Object actual)
- expected 预期的对象
- actual 实际的对象
- 除了比较Object,还可以是long,float,double,Object[]
-
如果比较double和float,还可以添加一个精度值参数delta
-
assertEquals(double unexpected,double actual, double delta)
- delta 表示精度值
-
assertEquals(double unexpected,double actual, double delta)
-
assertNotEquals 断言2个对象不相等
- assertNotEquals(String message, Object unexpected,Object actual)
-
assertNotEquals(Object unexpected, Object actual)
- unexpected 非预期的对象
- actual 实际的对象
- 除了比较Object,还可以是long,float,double
- 如果比较double和float,还可以添加一个精度值参数delta
-
assertArrayEquals 断言2个数组相等
- assertArrayEquals(String message, Object[] expecteds,
Object[] actuals) -
assertArrayEquals(Object[] expecteds, Object[] actuals)
-
参数除了Object[],还可以是java基础类型数组
boolean[],byte[],char[], short[],int[],double[],long[],float[]
-
参数除了Object[],还可以是java基础类型数组
- assertArrayEquals(String message, Object[] expecteds,
-
assertNotNull 断言这个对象不为空
-
assertNull 断言这个对象为空
-
assertSame 断言2个对象相等
-
assertNotSame 断言2个对象不相等
-
assertThat 断言是否匹配某个条件
后记
- @Rule和@ClassRule等注释需要补充说明
- 断言中assertThat需要补充说明
网友评论