万链网站做的怎么样,wordpress php 文件,网站织梦程序改成wordpress,本地生活服务网站怎么做为鼓励单元测试#xff0c;特分门别类示例各种组件的测试代码并进行解说#xff0c;供开发人员参考。
本文中的测试均基于JUnit5。
单元测试实战#xff08;一#xff09;Controller 的测试
单元测试实战#xff08;二#xff09;Service 的测试
单元测试实战特分门别类示例各种组件的测试代码并进行解说供开发人员参考。
本文中的测试均基于JUnit5。
单元测试实战一Controller 的测试
单元测试实战二Service 的测试
单元测试实战三JPA 的测试
单元测试实战四MyBatis-Plus 的测试
单元测试实战五普通类的测试
单元测试实战六其它
其它测试注解
除了我们示例中用到的WebMvcTest、DataJpaTest、MyBatisPlusTest等之外Spring还有若干针对性的测试注解如
Controller层WebFluxTest、GraphQlTest数据层DataRedisTest、DataMongoTest、DataElasticSearchTest、DataLdapTest……
当然还有通用的SpringBootTest。但SpringBootTest太通用它会拉起整个ApplicationContext而其它有针对性的注解则是拉起裁剪过的ApplicationContext因此有人认为SpringBootTest更适合集成测试。
单元、集成、系统测试的分工
由此引出一个测试分工的问题。即单元测试、集成测试、系统测试是否有清晰的边界。其实只要把握一个原则就行了随着测试粒度的增大Mock/Spy逐渐减少真实组件逐渐增多。单元测试一般是针对单个组件类的测试因此它的依赖一般都需要Mock出来除了测试数据所以有“无Mock、不单测”的说法集成测试则是针对完成一定功能的一组组件的测试这一组组件都应该是真实的它们的外部依赖则被Mock出来而系统测试已经没有Mock/Spy全部是真实组件了当然可以Mock外部接口。
打桩率
同时请注意如果测试一个类乃至一个方法需要打的桩即Mock/Spy太多说明它的依赖太多这个组件很可能违反了单一职责原则要考虑重构。
测试数据的准备
前面的一些示例中测试数据业务实体是作为测试类属性new出来的有时同样一组数据在好几个测试类里都有没有统一管理。更好的办法是将它们归集在一个管理组件里且不一定写死可以使用cvs文件或SQL文件如MyBatis Plus的测试示例JUnit5有很强的数据驱动能力。
测试衡量指标覆盖率与Assertion
通常单元测试的指标是代码覆盖率。但我们都知道单纯地统计覆盖率意义不大因为1覆盖了的代码是否是主要业务代码2有覆盖、无验证或曰断言Assertion等于什么也没有。
覆盖率分为行覆盖率、分支覆盖率、路径覆盖率和变异覆盖率。大多数团队都是从行、分支做起。路径覆盖较难一般不会要求。
变异mutation覆盖率就是解决上面说的Assertion问题的。就是说如果代码行为改变测试是否会失败如果没失败就说明没有Assert或Assert不够。 就测试而言不止单元测试最重要的有两条一要盖二要验。盖就是覆盖就是要有测试测试要覆盖最重要的那些分支验就是检查Assertion。脱离Assertion的数量和质量空谈测试覆盖率是毫无意义的。 自动生成工具
有些工具可以生成测试代码框架然后我们再往里补内容IDEA就自带另外它还有个插件叫Squaretest更强大但只有30天免费。如今大模型在这方面做的都不错国内能直接使用的有阿里的“通义灵码”。更多工具见这里。
工具只起辅助作用测试的有效性最终还要靠人来保障。
不测什么
无论单元测试还是集成测试都无需去测三方的组件。比如用到了Spring提供的某个组件它自己是有测试的不要专门去给它写测试。
单纯的CRUD没有自写SQL、没有业务逻辑的测的必要性也不大我们的示例中有这种测试主要还是为了示例。
更多参考资料
从爬行到奔跑 - 我们为什么需要单元测试阿里
Java单元测试实战阿里
单元测试的五个关键问题阿里
Spring boot Mybatis-Plus数据库单测实战