单元测试实践札记:JUnit
单元测试的好处
单元测试的好处:
- 为重构项目保驾护航
- 提高代码质量:做单元测试需要隔离外部依赖,促使工程做组件拆分,减少代码耦合度。
- 减少bug:确保各个单元逻辑正确
- 快速定位bug
测试驱动开发(TDD):
- 最早接触TDD理念是在伯克利的CS61B中,这门课有一个章节专门教你写单元测试,并鼓励通过TDD来推进Project和Lab的编写,整门课的Lab更是建立在评测机的基础上,令我受益匪浅。
- TDD的原理:开发业务代码前先编写测试用例代码,然后针对测试用例编写功能代码,使其通过。
- TDD好处:
- 协助整理需求,理清思路。
- 帮助设计合理的接口。
- 减少BUG
- 提高开发效率(熟练使用TDD的基础上)
- TDD缺点:
- 门槛高
- 时间和精力投入大
- 着眼局部,可能忽略整体设计
JUnit单元测试
依赖:spring-boot-test
常用注解:
- @BeforeAll:最先执行,必须为public static方法。
- @AfterAll:同理。
- @BeforeEach:每个单元测试之前执行。
- @AfterEach:同理。
- @Test:标识一个单元测试方法。
- @Disabled:禁用一个单元测试。
- @DisplayName:单元测试名字。
- @Timeout(value=1,unit=TimeUnit.SECONDS):限定执行时间,默认单位是s
- @RepeatedTest(value=3):重复执行多次,支持修改名字,点入源码查看格式后在name属性加入相应的即可。
断言:Assertions类常用方法
- assertEquals(actual,expect):是否相同
- assertSame(actual,expect):地址是否相同
- assertTrue(表达式):是否为真
- assertNull(obj):是否为空
- 同理,还有Not系列,道理是一样的。
基于SpringBoot环境的单元测试:
- 类注解:
@SpringBootTest
- 命名规范:
类名Test
带参单元测试:
- 第一步:将
@Test
改成@ParameterizedTest
- 第二步:使用
@ValuesSource
提供参数,支持以数组的形式,方便我们进行多个值的测试。- 可以用strings传入字符串数组
- 可以用classes传入类
- 其它注解:
- @NullSource:提供NULL的入参
- @EnumSource:提供枚举入参
- @MethodSource:方法传参,要求方法返回值必须是流
Stream<>
,并且设置为static - @CsvFileSource:csv文件作为入参,将每行作为一次参数输入,因此可以用多个参数接收。
单元测试的Maven插件
父pom文件引入:
<!-- 单元测试使用 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration> <argLine>-Dfile.encoding=UTF-8</argLine>
<!-- 根据打包环境执行对应的@Tag测试方法 -->
<groups>${profiles.active}</groups>
<!-- 排除标签 -->
<excludedGroups>exclude</excludedGroups>
</configuration>
</plugin>
标签单元测试:
- 第一步,通过
@Tag
注解标记单元测试,如dev、prod、exclude等,exclude表示不执行。 - 第二步,使用Maven,改变profiles环境,找到Lifecycle的test,就会自动执行相关测试方法。
注意:带有prod标记的测试方法不通过是无法打包的。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 AjaxZhan
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果