- 原则
- Automatic
- Isolation
- Repeatable
- 注解
- @Test
- expected——设置期望方法异常
- timeout——设置方法超时时间
- @BeforeClass——用于创建资源连接
- @Parameter——用于指定输入变量和期望输出变量
- @Before——用于每个测试方法前初始化
- @After——用于每个测试方法后
- @AfterClass——用于释放资源
- @Ignore——忽略该测试方法
- @RunWith(*.class)
- @Rule——设置全局超时时间或期望异常
- @Parameters——用于参数化测试时的数据集
- @Suite.SuiteClasses(Test*.class...)——用于整合同模块的测试类
- @Test
- 参数化测试
- 1. @RunWith(Parameterized.class)修饰测试类
- 2. @Parameter修饰public 的输入/输出成员变量 或者 使用包含输入/输出成员变量的有参构造器
- 3. @Parameters修饰public static 的数据集生成方法
- 4. 在具体测试方法中使用,传入输入变量,assert输出变量与真实输出值
- 异常测试
- assertThrows(Ex.class, 测试方法)
- try-catch(assert...)
- @Test(expected =Ex.class)
- 【推荐】@Rule public ExpectedException thrown = ExpectedException.none()
- thrown.expect(Ex.class)
- Mockito
- 在做UT的时候,如果测试方法会引用很多外部依赖的对象,比如:远程数据库,网络通讯,远程服务, 文件系统,以及上述外部依赖的容器化部署,我们可能没法控制这些外部依赖:外部依赖的权限很高,或者外部依赖的启动成本很高,甚至外部依赖还未开发完成
- 用Mock工具来模拟这些外部依赖的对象,完成UT
- 本质上是使用拦截器隔离真实外部依赖
- 常用注解
- 1. @RunWith(MockitoJUnitRunner.class) 或者 在@Before里initMocks(this)
- 2. @Mock修饰资源 或者 mock(资源.class)
- 3. when(资源调用)—thenReturn/thenThrow(模拟真实输出)
- thenXXX可以链式调用,对应多次调用行为的响应
- 4. assert对比模拟值和期望值
- 对于无返回值的资源操作,verify可以匹配调用行为
- 匹配调用次数:verify(资源, freq).调用
- freq可以是
- times(n), 调用n次
- never(),未调用
- atLeast(n),至少调用n次
- atMost(n),至多调用n次
- 匹配调用顺序:inorder.verify(资源).调用
- 使用参数匹配器anyXXX()可以忽略输入参数的具体值
- 实现ArgumentMatcher的match方法以自定义参数匹配器
- 对于构造器、私有方法、静态方法、单例,使用powerMock
- 常见问题
- 测试用例职责应该单一
- 测试异常Case断言推荐使用@Rule
- 测试异常Case不能只校验异常类型,同样要校验异常信息是否符合预期
- 断言不准确,仅断言retCode,无响应内容的校验,用例未必符合预期
- 用例没有执行业务方法,无效用例
- UT仅测试正常流程,没有覆盖其他分支
- 无断言用例, 无Assert