【Maven插件】自动生成Mock测试代码(2)

简介: 【Maven插件】自动生成Mock测试代码

版本功能

0.2.1-SNAPSHOT

  • fix - 修复在windows下无法生成测试代码的bug

0.2.0-SNAPSHOT

  • 支持配置json,通过json构造参数的值
  • 只支持实际方法的参数赋值,mock的参数赋值暂时不支持
  • 本次只支持自定义的类型的值进行配置
    下面为json配置中属性的描述:
{
"isOpen": "是否开启json配置-默认false",
"list":
  [
    {
      "scope":"作用域:全局(global)、包(package)、类(class)、方法(method) - 默认全局",
      "scopeValue": "作用域的值,global则无需配置该值,package则为包名,class则为类名,method则为方法名", 
      "fullyType": "类型的全限定名称",
      "value":{
        "若type=base,则该值固定为value":"值",
        "若type=custom,自定义类型,value下的key为fastjson序列化的属性名称":"值"
      }
    }
  ]
}
  • 删除废弃的配置
  • fix - 修复修改configFileName时无法下载配置文件的bug


json配置说明


  • 可以通过配置json来进行配置某个参数类型的参数值
  • 作用域(scope):全局(global)、包(package)、类(class)、方法(method)
  • 参数值配置优先级: 通过插件选填属性配置 < 全局(global)< 包(package)< 类(class)< 方法(method)

0.1.1-SNAPSHOT


  • testPackageName配置多个包,支持分号间换行,空格
  • testPackageName可以配置单个实现类。例如:wiki.primo.generator.primogeneratormocktestdemo.service.impl.UserServiceImpl.java 注意,配置单个类一定要以.java结尾。
  • 外部依赖只需要引入primo-generator-mock-test-jar即可。

0.1.0-SNAPSHOT


  • 解决参数数量相同,重载方法的mock报错,进行注释代码
  • 解决mock方法参数名称改变问题
  • 内存中加载内加载器中类,不再需要手动在插件中依赖需要的类,也就是配置第三方依赖不再需要了
  • 不需要网络便可以运行,原来是通过网络流下载文件,本版本已经修改为jar包读取
  • 增加测试类目录可配置

0.0.1

新增/优化功能

  1. 支持包下所有类中公共非静态方法生成测试方法
  2. 支持配置mock的包,将mock掉包下类的所有方法
  3. 支持基础类型和包装类型自动赋值
  4. 增加枚举参数的支持
  5. 可进行配置需要跳过的参数类型,直接配置包名,会进行跳过包内所有类的构造(用于跳过接口的构造,直接赋值为null)
  6. 优化全限定名称为简称,使用import导入包,名称存在重复的类,使用全限定名称
  7. 支持配置选择是否自动mock掉父类&自身非测试的方法 - 默认true
  8. 支持配置实体基础类型随机设置/使用默认值空值
  9. a. 随机 String长度:10位数字与字母,使用JDK UUID进行生成,确保唯一
  10. b. 随机 int:[0,1000)
  11. c. 随机 byte:[0,1)
  12. d. 随机 short:[0,127)
  13. e. 随机 double:[0.00,10000.00)
  14. f. 随机 float:[0.00f,10000.00f)
  15. g. 随机 long:[0L,100000L)
  16. g. 随机 char:数字/字母
  17. 每个测试类使用统一的before注解进行mock方法(考虑到后面每个分支的mock,如果同意进行mock的话,会导致分支无法全面覆盖)
  18. mock注解的类,使用了全限定名称,优化为简称,类进行导入,重复类简称,第一个类使用简称,后面的类使用全限定名称
  19. 不再支持配置其他包下的类进行mock,非测试类的所有方法均进行mock,测试类的私有方法也进行mock
  20. 已生成测试类,不再进行覆盖生成
  21. 支持第三方包类的加载和构造
  22. 对于一些没有setter方法的属性,也进行了set值;期望:对于没有setter的属性值,不进行设置
  23. 支持字符串、int、long、布尔类型随机值的范围设置
  24. 支持配置生成父类属性的set方法进行设置值,默认true,生成的set方法包含父类的属性(注意,父类如果不在当前项目中,需要在插件中引入包的依赖)
  25. 测试类新增方法支持追加生成mock测试方法
  26. 支持在不同包下的测试类同时进行生成
  27. 初始化下载配置文件不再需要,直接运行生成,自动检测是否下载,未下载先进行下载配置文件再生成

其他功能排期

  • 配置文件可以配置不进行下载到本地,默认下载
  • 支持日志级别设置,方便使用者进行调试
  • 支持if-else生成多个mock分支方法
  • 方法的参数值支持json文件进行配置
  • 检测代码实现类的方法覆盖率百分比查看以及通知到钉钉群
  • 支持简单集合构造赋值
  • 支持配置静态方法mock,需要进行配置静态类的全限定名称(静态方法不建议进行mock)
  • 测试类中的私有方法进行mock,私有方法专门开方法进行生成mock测试,默认不支持,需要配置(私有方法不建议进行mock)
  • 同一个测试方法中存在Mock方法名称重复(参数个数不同)无法进行区分,仅仅对于第一个方法进行mock,且会存在重复mock代码生成;期望:支持同名方法的mock
  • 无法支持重名方法(参数个数相同,参数类型不同),会出现生成的mock方法引用不明确;期望:mock方法引用明确(通过匹配参数类型解决)
  • 不支持嵌套自定义参数的构造;期望:支持多级参数的构造
  • 不支持集合的构造;期望:支持集合的构造
  • mock方法返回值不支持自定义,统一是返回null;期望:支持mock返回值的自定义/生成值
  • 不支持Spring自定义事务管理器DataSourceTransactionManager的mock;期望:支持自定义事务的mock
  • 支持多级参数构造赋值
  • 支持重载方法的mock
  • 支持断言配置
  • 参数值的配置yml文件
  • 生成的测试方法可以配置是否编译报错,强制开发者主动进行单元测试

注意

配置mock静态方法:

默认使用@RunWith(MockitoJUnitRunner.class),如果配置了mock静态方法,将使用@RunWith(PowerMockRunner.class)。

使用PowerMockRunner与MockitoJUnitRunner类,都无法支持父类中的属性(service的实现类中又同时注入了该类)自动注入的mock(例如mybatis中service层的泛型父类中的泛型baseMapper)。这是由于Mock类会将这两个类作为不同的实例来进行处理,只会mock掉你注入service实现类的基类,而无法注入service实现类的父类中的mapper。

例如:

service实现类

public class WorkFlowServiceImpl extends ServiceImpl<WorkFlowMapper, WorkFlowEntity> implements IWorkFlowService {
    @Autowired
    private WorkFlowMapper workFlowMapper;
    //...
}

父类ServiceImpl:


public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
    @Autowired
    protected M baseMapper;
    //...
}

在WorkFlowServiceImpl中使用时:

baseMapper.deleteById("1");
• 1

在mock测试类中:

@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.management.*")
@PrepareForTest({BeanConvertUtil.class, FieldBaseDto.class})
public class WorkFlowServiceImplTest {
    @InjectMocks
    private WorkFlowServiceImpl workFlowServiceImpl;
    @Mock
    private WorkFlowMapper workFlowMapper;
    //...
}

无法进行mock掉baseMapper实例,这是由于baseMapper与workFlowMapper并不是同一个实例!这里仅仅只能mock掉workFlowMapper。


目前可以在service层的实现类中将baseMapper再次注入,则使用PowerMockRunner.class也可以进行mock


service层的实现类不推荐使用泛型基类service父类进行调用泛型mapper操作数据库层!可以选择注入Mapper再进行调用。

使用体验

199个测试方法,一共覆盖309个被测试方法,使用primo-generator-mock-test生成后,仅仅只使用了3个多小时进行mock优化(仅仅优化了运行报错的方法,没有进行完善分支测试)。

按照我以前的经验,如果全部由自己写,一切顺利的情况下,199个方法的mock测试,至少要多出几倍的时间。

(此测试项目为使用mybatis-plus的项目,service层的实现类非常多的方法直接使用了父类方法,导致mock很麻烦,耽搁了一些时间,其他项目相对而言会节省更多时间)


测试类:

20201229182038807.jpg

测试方法:

20201229182104332.jpg

单元覆盖数据:20201229182143877.jpg


目录
相关文章
|
6天前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
20天前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
49 6
基于Python访问Hive的pytest测试代码实现
|
4天前
|
Java C++
代码文件间重复性测试
本文介绍了如何使用代码相似性检测工具simian来找出代码文件中的重复行,并通过示例指令展示了如何将检测结果输出到指定的文本文件中。
|
11天前
|
测试技术 数据库连接 数据库
提升软件测试效率与灵活性:探索Mock测试的重要性
【9月更文挑战第20天】在软件测试领域,提升测试效率与灵活性至关重要。Mock 测试通过模拟外部组件,使模块能独立测试,缩短测试周期;快速反馈机制让测试结果即时可见,加速问题修复;还能模拟异常情况和进行参数化测试,增强测试全面性与灵活性,从而显著提高软件质量和开发效率。
|
23天前
|
测试技术 UED
软件测试的艺术:从代码到品质的探索之旅
在数字时代的浪潮中,软件已成为我们生活和工作不可或缺的一部分。然而,高质量的软件背后隐藏着一门鲜为人知的艺术——软件测试。本文将带你走进这门艺术的世界,从基础理论到实践应用,一起探索如何通过软件测试保障产品质量,提升用户体验,并最终实现从代码到品质的华丽转变。
|
16天前
|
敏捷开发 安全 测试技术
软件测试的艺术:从代码到用户体验的全方位解析
本文将深入探讨软件测试的重要性和实施策略,通过分析不同类型的测试方法和工具,展示如何有效地提升软件质量和用户满意度。我们将从单元测试、集成测试到性能测试等多个角度出发,详细解释每种测试方法的实施步骤和最佳实践。此外,文章还将讨论如何通过持续集成和自动化测试来优化测试流程,以及如何建立有效的测试团队来应对快速变化的市场需求。通过实际案例的分析,本文旨在为读者提供一套系统而实用的软件测试策略,帮助读者在软件开发过程中做出更明智的决策。
|
20天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
49 6
|
22天前
|
测试技术 持续交付
软件测试的艺术:从代码到信心的旅程
探索软件测试不仅仅是发现错误的技术过程,它是一场从编码到用户信心的转化之旅。本文将带你了解如何通过创造性思维和系统方法,将软件测试变成一门艺术,确保产品质量的同时,提升用户对技术的信赖。
33 4
|
25天前
|
人工智能 计算机视觉
AI计算机视觉笔记十五:编写检测的yolov5测试代码
该文为原创文章,如需转载,请注明出处。本文作者在成功运行 `detect.py` 后,因代码难以理解而编写了一个简易测试程序,用于加载YOLOv5模型并检测图像中的对象,特别是“人”类目标。代码实现了从摄像头或图片读取帧、进行颜色转换,并利用YOLOv5进行推理,最后将检测框和置信度绘制在输出图像上,并保存为 `result.jpg`。如果缺少某些模块,可使用 `pip install` 安装。如涉及版权问题或需获取完整代码,请联系作者。
|
7天前
|
机器学习/深度学习 敏捷开发 测试技术
软件测试的艺术:从代码到用户心灵的旅程
在阅读本文之前,让我们先共同思考一个问题:“为什么即使是最小的错误,也可能对用户体验和企业声誉造成巨大的影响?” 正如我们将要探讨的,软件测试不仅是技术活动的一种,更是确保产品质量、优化用户体验和维持品牌声誉的关键步骤。本文将引导您了解软件测试的基本概念,探索其背后的艺术性,以及如何高效地实施测试策略来达到最佳的质量保证结果。
19 0

推荐镜像

更多
下一篇
无影云桌面