什么是单元测试
单元测试(Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。
在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法。
单元测试的作用
提升软件质量。单元测试是一种白盒测试,可以帮我们快速排查和定位问题。
增加重构自信。单元测试100%通过,那么重构代码肯定会少很多问题。
单元测试的基本原则
宏观上,单元测试要符合AIR原则
A : Automatic 测试需要全自动执行的,用断言(Assertions)来验证结果。
I : Independent 用例之间不允许互相调用
R : Repeatable 测试是可重复的
微观上,单元测试的代码层面要符合BCDE原则
B: Border 边界值测试,循环的边界、特殊取值等
C: Correct 正确的输入
D: Design 与设计文档相结合
E : Error 找出错误
JUnit5框架介绍
Java 语言的单元测试框架相对统一,JUnit 和TestNG 几乎始终处于市场前两位。其中 JUnit 以较长的发展历史和源源不断的功能演进,得到了大多数用户的青睐。
JUnit4没有什么外部依赖,其所有的功能都被打包在一个构件(artifact)中。这完全违反了单一职责原则,不同的使用者,依赖的都是一个同样的构件。
于是JUnit5进行了一些“功能分离”。作为平台的 JUnit ”(用于运行我们的测试)和“作为工具的 JUnit ”(用于撰写我们的测试)。
于是JUnit 团队决定将 JUnit 5 分成三个子项目。
Junit5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
JUnit Platform, JUnit希望能作为一个测试平台,其他的自动化测试引擎或自己定制的引擎都可以接入这个平台实现对接和执行提供了一套统一的 API 以运行测试,及基于 API 之上的一套工具
JUnit Jupiter,是JUnit5的核心,提供撰写测试的 API,它包含了注解、断言等等,还有很多丰富的新特性来使JUnit自动化测试更加方便。
JUnit Vintage 为在平台上运行JUnit 3、JUnit 4的测试提供的兼容的测试引擎,也可以看作是基于JUnit Platform实现的接入范例
JUnit Jupiter
它提供的注解(Annotations)可以帮我们构建测试方法。
@Test, @ParameterizedTest, @RepeatedTest, @TestFactory……
不同注解搭配起来使用可以适应不同情况的测试方法。
它提供的断言(Assertions)能实现自动化地判断正误。
测试方法的正确性判断就由断言来实现。
它提供的假设(Assumptions),(个人感觉类似于 if )
假设失败则停止测试,断言失败则抛出错误。
可以搭配断言使用。
JUint的一个标准测试类
@BeforeAll
表示该静态方法在所有测试方法之前运行
@BeforeEach
表示方法在每个测试方法运行前都会运行
@Test
表示方法是一种测试方法,可以作为一个测试案例。
里面写对单元的测试内容。
@Disabled
用于禁用测试类或测试方法
@AfterAll
表示静态方法在所有测试方法之后运行
个人的理解是:
@Before用于创造测试条件
@Test 是主要的测试方法
@After 用于测试完成之后的一些收尾工作
JUint断言的使用
编写测试内容,判断测试是否正确就需要用到断言。
断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此也可以在测试时启用断言而在部署时禁用断言。
JUint假设的使用
假设与断言的区别:假设失败则停止测试,断言失败则抛出错误。
假设可以配合断言使用
实际使用
参考我的Spring boot 的Demo
https://www.jianshu.com/p/36da918d613f
参考链接
JUint中文文档
https://www.bookstack.cn/read/junit5/README.md
https://zhuanlan.zhihu.com/p/55648107
https://www.jianshu.com/p/a3fa5d208c93