原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (十五)编写测试-断言\假设\使测试失效
2020-06-02 16:45
169 查看
本文分享在编写测试中“断言、假设、使测试失效”三节内容的方法。
断言
重要性:★☆☆☆☆
在四阶段测试模式的
verify阶段,我们通过各种断言证明测试的结果——方法的返回值、SUT状态的变更、对外部依赖类的调用、对数据库、文件系统造成的变更、抛出的异常等等——符合我们的预期。例如断言被测试的加法器计算2 + 2的结果是4。
JUnit Jupiter本身定义了大量的断言,全部以org.junit.jupiter.api.Assertions类上的静态方法的形式存在,如
assertEquals、
assertTrue、
assertFalse、
assertNull、
assertNotNull、
assertThrows、
assertTimeout、
assertTimeoutPreemptively等等。
但是在单元测试领域有很多更加好用的断言库,其中最有名的是
AssertJ,这也是本教程后面章节重点推介的断言库。建议直接使用
AssertJ,放弃JUnit Jupiter自带的断言。
假设(Assumptions)
重要性:★★★☆☆
从JUnit 4开始在测试中支持假设
Assumptions。JUnit Jupiter的假设都是
org.junit.jupiter.api.Assumptions类的静态方法。
当假设
assumption失败时,余下的测试内容会终止执行,测试被标识为
aborted状态(而不是失败
failed),直接终止。与断言失败不同,当断言
assertion失败时,测试会被认定为失败
failed状态。
假设的典型应用场景是:当一个测试方法继续执行没有意义的时候——例如,测试所依赖的环境条件不满足时——终止测试的继续执行。
下面是代码示例:
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assumptions.assumeTrue; import static org.junit.jupiter.api.Assumptions.assumingThat; import example.util.Calculator; import org.junit.jupiter.api.Test; class AssumptionsDemo { private final Calculator calculator = new Calculator(); @Test void testOnlyOnCiServer() { assumeTrue("CI".equals(System.getenv("ENV"))); // remainder of test } @Test void testOnlyOnDeveloperWorkstation() { assumeTrue("DEV".equals(System.getenv("ENV")), () -> "Aborting test: not on developer workstation"); // remainder of test } @Test void testInAllEnvironments() { assumingThat("CI".equals(System.getenv("ENV")), () -> { // perform these assertions only on the CI server assertEquals(2, calculator.divide(4, 2)); }); // perform these assertions in all environments assertEquals(42, calculator.multiply(6, 7)); } }
使测试失效
重要性:★★★★☆
通过@Disabled
注解使测试临时失效。测试方法被直接忽略,不再参与测试执行。
@Disabled
可以注解在测试类上,也可以注解在测试方法上。如果注解在测试类上,整个测试类都将被忽略。如果注解在测试方法上,只有这个测试方法会被忽略掉。
下面是代码示例:
import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; class DisabledTestsDemo { @Disabled("Disabled until bug #42 has been resolved") @Test void testWillBeSkipped() { } @Test void testWillBeExecuted() { } }
在添加
@Disabled注解时最好像上面代码示例一样,提供失效这个测试的理由。
这一节就讲到这里,下一节我们讲讲"有条件执行测试"。
相关文章推荐
- 原创 | TDD工具集:JUnit、AssertJ和Mockito (二十一)编写测试-测试模板
- 原创 | TDD工具集:JUnit、AssertJ和Mockito (二十四)编写测试-内建扩展
- 原创 | TDD工具集:JUnit、AssertJ和Mockito (二十三)编写测试-并行测试
- 原创 | TDD工具集:JUnit、AssertJ和Mockito (十六)编写测试-有条件执行测试
- 原创 | TDD工具集:JUnit、AssertJ和Mockito (二十)编写测试-参数化测试
- 使用 Junit + Mockito 实践单元测试
- 原创 | TDD工具集:JUnit、AssertJ和Mockito (十七)编写测试-标签和过滤
- 原创 | TDD工具集:JUnit、AssertJ和Mockito (十八)编写测试-测试执行顺序\嵌套的测试
- 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
- 单元测试进阶-使用 Mockito 进行测试
- spring Boot测试的最佳实践和测试架构的启发(JUnit4和mockito,包括MockMvc)
- 基于JUnit使用PowerMock的Mockito扩展在Maven测试项目中的配置说明
- springBoot中使用Junit和Mockito进行单元测试
- 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
- Struts2单元测试:使用Junit测试Action
- 有效使用Mock编写java单元测试
- 测试框架Mockito使用笔记
- 使用junit+mockito进行mock测试实例
- JUnit单元测试中获取Spring中的bean测试类的编写
- [原创]基于mock对象和JUnit框架简化Spring Web组件单元测试