后端ut测试
关于测试
测试都包括哪些
广义的测试包括UT、IT、压力测试、硬件测试等等,这里重点讨论Unit Test即单元测试。
啥是UT
为什么要写UT
让你的代码质量更可靠&让你对代码结构更加敏感&迫使你写更优质的代码&…
什么在阻止你写UT
代码本身的原因
如果代码复杂度较高还缺少必要的抽象和拆分,就会让人对写UT望而生畏。
编码工作量的原因
无论是用什么样的单元测试框架,最后写出来的单元测试代码量也比业务代码只多不少,在不作弊的前提下要保证相关的测试覆盖率,大概要三倍源码左右的工作量。
难以维护的原因
更多的代码量,加上单测代码并不像业务代码那样直观,还有对单测代码可读性不重视的坏习惯,导致最终呈现出来的单测代码难以阅读,要维护更是难上加难。
合格的UT什么样
至少要满足:
测试的是一个代码单元内部的逻辑,而不是各模块之间的交互。
无依赖,不需要实际运行环境就可以测试代码。
运行效率高,可以随时执行。
Java如何写UT
Java开发一般都是用JUnit或TestNG,我们大多人还是使用JUnit4。本文不讨论语法,只介绍一般性的使用规范。
任何一个UT中需要至少包含一个assert,用System.out.println()来验证结果不符合UT的规范,一般都是验证方法的返回结果,如assertEquals(200, statusCode)而不是System.out.println(200==statusCode)。
Assertion只能保证走过的分支的结果是否正确,无法保证一定是走过了某些分支。
为啥要Mock
不用Mock我们自己也能实现测试(如匿名类),只不过对代码的要求非常高
Mock框架
第一,它相对于其他几个老牌库来说比较新并且更新活跃,在github中引用的也最多
第二,它的fluent API风格的代码可读性很高跟JDK8的Stream风格很像
第三,它抽象出测试中的经典概念,如when().thenReturn()、doThrow().when()、verify()、times()、never()以及各种注解很容易理解
什么样的方法需要mock
任何被非本类的功能均需要mock,如数据库访问、RPC接口、外部引入的jar包等
环境变量、系统属性和方法
测试只测试当前类当前方法的功能,依赖方的功能由依赖方的UT来保证正确性,本层不负责验证
mock本质上是一个proxy,在需要提供功能的时候由开发者提供“伪实现”
什么样的方法不需要mock
本类的需要测试的方法依赖的同类方法,该方法的正确性由该方法自身的UT来保证
静态方法,静态方法由自身的UT来保证功能的正确性
protected方法是可以测试的,只要测试代码类和要测试的类在同一个package下面就可以
private方法(有异议),我的看法是私有方法如果逻辑很多,应该重构出来提供public方法或者新的Class进行重构;如果逻辑不多仍然保证不了无bug ,可以使用反射来测试。其实private方法的测试是需要通过对public方法的测试来完成的,因为private方法总是会被public方法调用的。还有一种测试方法就是放宽访问限制,private方法改为protected,并且用guava的 @VisibleForTesting注解标注放宽权限的方法。
如何设计适合测试的接口
测试覆盖率
总结
附ut案例如下:
@Service @Slf4j public class LfmProjectDecisionServiceImpl implements LfmProjectDecisionService {
@Resource private LfmOldLongCityService lfmOldLongCityService; @Resource private LfmProjectMapper lfmProjectMapper; @Resource private LongcityIamClient longcityIamClient; public String queryOperationRating(String projectCode) {
String operationRating = ""; LongcityUser user = longcityIamClient.getUserListByRoleCode("R_UC__6f9464de").getResult().get(0); LfmBpm3WorkflowDetailedEntity listOpinion; LfmProject lfmProject = lfmProjectMapper.selectByProjectCode(projectCode); if(lfmProject.getOldOrNew().equals("old")) {
listOpinion = lfmOldLongCityService.queryOperationRatingByProId(lfmProject.getOldProjectId(), user.getLoginName()); } else {
listOpinion = c1Bpm3TwMapper.queryOperationRatingByProId(projectCode, user.getLoginName()); } if (null != listOpinion) {
String approvalOpinion = listOpinion.getApprovalOpinion(); if (StringUtils.isNotEmpty(approvalOpinion)) {
Map<String, Object> parse = (Map<String, Object>) JSONUtils.parse(approvalOpinion); Set<String> keySet = parse.keySet(); for (String key : keySet) {
if (key.startsWith("obj")) {
Map<String, Object> map1 = (Map<String, Object>) parse.get(key); String rhythm = (String) map1.get("keyName"); if (StringUtils.isNotEmpty(rhythm) && rhythm.equals("运营节奏综合评定")) {
operationRating = (String) map1.get("value"); } } } } } return operationRating; } }
讯享网
测试类:
讯享网@RunWith(PowerMockRunner.class) public class LfmProjectDecisionServiceImplTest {
@InjectMocks private LfmProjectDecisionServiceImpl lfmProjectDecisionService; @Mock private LfmOldLongCityService lfmOldLongCityService; @Mock private LfmProjectMapper lfmProjectMapper; @Mock private LongcityIamClient longcityIamClient; @Test public void queryOperationRating() {
ResultBean<List<LongcityUser>> listResultBean = new ResultBean<>(); List<LongcityUser> longcityUserList = new ArrayList<>(); LongcityUser longcityUser = new LongcityUser(); longcityUser.setLoginName("Stephen"); longcityUserList.add(longcityUser); listResultBean.setResult(longcityUserList); when(longcityIamClient.getUserListByRoleCode(any())).thenReturn(listResultBean); LfmProject project = new LfmProject(); project.setOldOrNew("old"); project.setOldProjectId("3562"); when(lfmProjectMapper.selectByProjectCode(any())).thenReturn(project); LfmBpm3WorkflowDetailedEntity listOpinion = new LfmBpm3WorkflowDetailedEntity(); listOpinion.setApprovalOpinion(""); when(lfmOldLongCityService.queryOperationRatingByProId(any(), any())).thenReturn(listOpinion); this.lfmProjectDecisionService.queryOperationRating(""); } }
写码不易,要一键三连哦~~~>-<

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/39015.html