单元测试
好的单元测试必须遵守AIR 原则
-
A:Automatic(自动化)
-
I: Independent(独立性)
不同的测试用例,必须使用独立的测试数据,关键的测试条件不能相同,避免使用 kdtId = 1, itemId = 1 这样的简单条件。
-
R: Repeatable(可重复) 单元测试重复执行时,必须保证内存、数据库、缓存中的数据已经清理。
单元测试必须是全自动的,非交互式的,必须使用assert 验证
保持单元测试的独立性。单元测试用例之间不能相互调用,不能依赖执行的先后顺序
单元测试是可以重复执行的,不能受到外界环境的影响。
新增代码及时补充单元测试,如果影响了原有的单测,及时修改(建议提测之前完成)
命名:
- 类命名:被测试类名+Test
- 方法命名:test_被测试方法名_操作预期
单元测试必须写在如下工程目录中: src/test/java,不允许写在业务代码目录下。
禁止通过在业务代码类中写 main 函数进行测试
单元测试的基本目标:行覆盖率80% 和条件覆盖率 70%,核心模块的行覆盖率和条件覆盖率 100%,必须设置阀值。
单元测试的BCDE 原则,保证被测模块的交付质量
- B: Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。
- C:Correct,正确的输入,并得到预期结果。
- D: Design,与设计文档结合,编写测试用例
- E: Error,错误的信息输入,得到预期结果
注解
- @RunWith:标识为JUnit的运行环境,运行器:MockitoJUnitRunner和PowerMockRunner
Mockito提供了可读性较强、易于使用的mocking测试方法,而PowerMock提供了Mockito-like API是它使用方法基本与Mockito有很大类似,且它能解决静态方法、私有方法等“问题方法”
- @SpringBootTest:获取启动类、加载配置,确定装载Spring Boot;
- @Test:声明需要测试的方法;
- @BeforeClass:针对所有测试,只执行一次,且必须为static void;
- @AfterClass:针对所有测试,只执行一次,且必须为static void;
- @Before:每个测试方法前都会执行的方法;
- @After:每个测试方法前都会执行的方法;
- @Ignore:忽略方法;
- 注释@Mock来创建虚拟对象。对于被测class,使用@injectMocks进行注释即可
为什么要mock
Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。
比较
- assertEquals
- assertNotEquals
- assertArrayEquals
- assertFalse
- assertTrue
- assertNotNull
- assertNull
网友评论