使用testMe自动生成单元测试用例

news2024/9/27 23:31:22

文章目录

  • 1、testMe简介
  • 2、插件对比
    • 2.1 testMe
    • 2.2 Squaretest
    • 2.3 Diffblue
  • 3、IDEA插件安装
  • 4、单测用例
    • 4.1 maven依赖
    • 4.2 生成用例
  • 5、自定义模板
  • 6、使用自定义模板生成用例
  • 7、调试用例

1、testMe简介

公司对于系统单元测试覆盖率有要求,需要达到50%或80%以上才可以,但是对于之前的老项目或者是前期赶进度未添加单元测试用例的项目来说,手动添加单元测试耗时又费力,这时候我们就需要一款能够提高效率的一款插件来帮助我们提高单元测试覆盖率,经过对比temstMe、Squaretest、Diffblue三个插件,最终选择了一款免费的testMe来作为我们自动化单元测试用例生成插件。

2、插件对比

2.1 testMe

优点:

  1. 开源免费
  2. 使用方便,上手容易
  3. 生成的代码比较简洁

缺点:

  1. 默认方法上都会有throws exception,但是可以通过定制模板去掉
  2. mock方法入参构建不好,经常用null作为入参,需要自己调整入参
  3. 不能增量的生成新方法的单测用例

2.2 Squaretest

优点:

  1. 使用方便,上手容易
  2. 生成的测试方法入参会根据逻辑需要的字段自动填充属性
  3. 可以增量生成指定方法的单元测试用例

缺点:

  1. 收费,但是可以试用30天
  2. 部分生成的方法没有Assert断言判断结果,也需要微调代码
  3. 存在部分重复代码,例如构建的入参实体,如果入参一致的情况下会存在重复代码

2.3 Diffblue

优点:

  1. 功能强大,生成的单元测试用例几乎不用改动就能正常运行
  2. 收费版本会得到其公司支持

缺点:

  1. 功能全的版本需要收费
  2. 免费版本只能用于开源项目,公司项目感觉慎用
  3. 会将代码上传到远端进行生成测试用例

3、IDEA插件安装

File——>Settings——>Plugins——>marketplace,搜索testMe,然后install就好了,插件安装完成后需要重启一下。

在这里插入图片描述

4、单测用例

4.1 maven依赖

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.5.0</version>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.5.1</version>
    <scope>test</scope>
</dependency>

4.2 生成用例

我们找到需要生成单元测试的类,然后右键点击Generate。

在这里插入图片描述

在弹窗中选择testMe。

在这里插入图片描述

继续选择Junit4 & Mockito来生成单元测试用例。

在这里插入图片描述

我们看下生成的单元测试用例。

在这里插入图片描述

这个单元测试用例有几点柑橘不是很好,第一点是生成的类没有类注释头,第二是Mock 注解 和InjectMocks注解挨在一起,希望能空一行,第三是生成的脚注有点多余,我们不需要。所以这时候我们需要通过自定义模板来修改这些。

5、自定义模板

File——>Settings——>TestMe——>TestMe template 找到testMe的模板。

在这里插入图片描述

我们找到Junit4 & Mockito这个模板,点击上面菜单拷贝一份模板。

在这里插入图片描述

我们在此拷贝的模板基础上进行修改。
首先我们添加一下类注释。

/**
 * @author author
 * @date ${DATE} ${TIME}
 */

在这里插入图片描述

其次我们在测试类上添加RunWith注解。

import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;

在这里插入图片描述

第三我们添加Mock和InjectMocks添加空行及删除脚注。

在这里插入图片描述

在这里插入图片描述

以下为本人使用的完整模板代码。

#parse("TestMe macros.java")
#set($hasMocks=$MockitoMockBuilder.hasMockable($TESTED_CLASS.fields))
#if($PACKAGE_NAME)
package ${PACKAGE_NAME};
#end

import org.junit.Assert;
import org.junit.Test;
#if($hasMocks)
import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
//import static org.mockito.Mockito.*;
#end

/**
 * @author author
 * @date ${DATE} ${TIME}
 */
 
#parse("File Header.java")
@RunWith(MockitoJUnitRunner.class)
public class ${CLASS_NAME} {
#renderMockedFields($TESTED_CLASS.fields)

#renderTestSubjectInit($TESTED_CLASS,$TestSubjectUtils.hasTestableInstanceMethod($TESTED_CLASS.methods),$hasMocks)
#if($hasMocks)

    @Before
    public void setUp() {
        MockitoAnnotations.${MockitoMockBuilder.initMocksMethod}(this);
    }
#end
#foreach($method in $TESTED_CLASS.methods)
#if($TestSubjectUtils.shouldBeTested($method))

    @Test
    public void #renderTestMethodName($method.name)() {
#if($MockitoMockBuilder.shouldStub($method,$TESTED_CLASS.fields))
#renderMockStubs($method,$TESTED_CLASS.fields)

#end
        #renderMethodCall($method,$TESTED_CLASS.name)
#if($method.hasReturn())        Assert.#renderJUnitAssert($method)#end
    }
#end
#end
}

6、使用自定义模板生成用例

我们在使用同样的流程来根据自定义模板生成单元测试用例。

在这里插入图片描述

我们看下生成的新的测试用例格式如下。

在这里插入图片描述

代码格式会比之前好一点,但是生成的单元测试用例还是需要我们微调一下才能跑。

7、调试用例

如果只是注重单元测试覆盖率,那么按照上面的方法生成即可,如果还需要单元测试用例跑通,那么基本上需要我们在微调一下代码。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RV1126-RV1109-进入uboot的按键和名字显示-HOSTNAME

今天添加一个小功能,就是uboot是按CTRLC进入的 今日我做了一个定制,让按L或者l让也进入uboot指令模式,并且修改主板名字显示 默认是CTRLC:键码值是0x03(ASCII对照表) 于是代码中跟踪: //rv1126_rv1109/u-boot/common/console.c int ctrlc(void) { #ifndef CONFIG_SANDBOXif (…

Python大数据之Python进阶(五)线程

文章目录 线程1. 线程的介绍2. 线程的概念3. 线程的作用4. 小结 线程 学习目标 能够知道线程的作用 1. 线程的介绍 在Python中&#xff0c;想要实现多任务除了使用进程&#xff0c;还可以使用线程来完成&#xff0c;线程是实现多任务的另外一种方式。 2. 线程的概念 线程是进程…

【chrome基础】Chrome、Chromium、libcef、electron版本关系大揭秘!

文章目录 概述chrome、Chromium、cef、electron 版本管理chrome的各种概念和学习资料V8 bindings 设计谷歌V8引擎探秘&#xff1a;基础概念Chrome 的插件&#xff08;Plugin&#xff09;与扩展&#xff08;Extension&#xff09;Chrome插件开发 概述 Chrome、Chromium、libcef、…

电荷泵CP原理及在PLL/DLL中的使用

参考【模拟集成电路】电荷泵&#xff08;CP&#xff09;设计_pll 电荷泵-CSDN博客 PLL-CP | Fitzs Blog 1.PLL/DLL中电荷泵概念及原理 电荷泵CP(charge pump)是锁相环中重要的一个模块&#xff0c;其主要功能是将鉴频鉴相器 (PFD) 输出的时钟相位差值转化为电荷&#xff0c;将…

UE5如何实现语言本地化管理(中英文切换)

一。实现蓝图的本地化控制 1.打开本地化控制面版 2.设置收集文本的路径 3.添加自己需要使用的语言&#xff0c;一般是中文 4.收集文本并进行转换语言的翻译 5.进入面板之后开始翻译 6.翻译完成之后计算字数并编译 7。一整套流程下来就是这样了 8.编译完成之后会在文件中生成…

一文汇总 Linux 内核调试的方法

内核开发比用户空间开发更难的一个因素就是内核调试艰难。内核错误往往会导致系统宕机&#xff0c;很难保留出错时的现场。调试内核的关键在于你的对内核的深刻理解。 在调试一个bug之前&#xff0c;我们所要做的准备工作有&#xff1a; 有一个被确认的bug&#xff0c;包含这…

10.10泊松、指数、伽马分布的理解

泊松定理、泊松分布 泊松定理就是描述在T段时间内每时每刻一直进行一个实验&#xff0c;这个实验成功的概率由t段时间总的成功期望次数决定&#xff0c;就是给二项分布加了个时间 泊松分布可用来描述某段时间来电次数的分布&#xff0c;电话台收到的呼叫数&#xff0c;商城的…

2023年【陕西省安全员B证】最新解析及陕西省安全员B证操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年陕西省安全员B证最新解析为正在备考陕西省安全员B证操作证的学员准备的理论考试专题&#xff0c;每个月更新的陕西省安全员B证操作证考试祝您顺利通过陕西省安全员B证考试。 1、【多选题】《陕西省建设工程质量…

导入导出Excel

一、Springboot Easyexcel读取写入数据&#xff0c;多头行数&#xff0c;多sheet&#xff0c;复杂表头简单实现 1. 导入依赖&#xff0c;阿里的easyexcel插件 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId>…

uniapp上echarts地图钻取

1: 预期效果 通过切换地图 , 实现地图的钻取效果 2: 实现原理以及核心方法/参数 一开始是想利用更换地图数据的形式进行地图钻取 , 这就意味着我们需要准备全国30多个省份的地图数据 , 由于一开始考虑需要适配小程序端 , 如此多的地图文件增加了程序的体积 , 如果使用接口调…

element el-table表格表头某一列表头字段修改颜色

需求&#xff1a; 1 使用 :header-cell-class-name"addClass" 属性 2 根据显示条件 在redText&#xff0c;whiteText 中设置你想要添加的必填表头index 3.根据条件修改文字样式 完整代码 <el-table ref"tableRef" :cell-style"{ color: #FFF,…

拥抱产业发展机遇 兑现5G商业价值

[阿联酋&#xff0c;迪拜&#xff0c;2023年10月10日] 今天&#xff0c;以“将5G-A带入现实”为主题的2023全球移动宽带论坛在迪拜举行。本次大会上&#xff0c;华为轮值董事长胡厚崑与GSMA总干事Mats Granryd围绕“5G产业进程与发展”连线对话。胡厚崑指出&#xff0c;“技术发…

redis 哨兵 sentinel

sentinel巡查监控后台master主机是否故障&#xff0c;如果故障根据投票数自动将某一个从库转换为新主库&#xff0c;继续对外服务 sentinel 哨兵的功能 监控 监控主从redis库运行是否正常消息通知 哨兵可以将故障转移的结果发送给客户端故障转移 如果master异常&#xff0c;则…

openEuler 系统搭建高可用 Kubernetes 集群

k8s 高可用集群部署 在生产环境中&#xff0c;k8s 高可用集群部署能够确保应用程序稳态运行不出现服务中断情况。 此处我们基于 openEuler 系统环境&#xff0c;配置 Keepalived 和 HAproxy 使负载均衡&#xff08;LB/Load Balancer&#xff09;、实现高可用。 步骤如下&…

NZ系列工具NZ04:VBA网络连接测试

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

UOS通过GPG对文件签名验签

本人用的版本&#xff1a;gpg (GnuPG) 2.2.12 生成密钥 生成公钥/私钥对 gpg --full-generate-key设置密钥的长度 默认回车3072&#xff0c;越长越安全。 设定密钥的有效期限 默认回车“0” 构建用户标识 输入姓名、邮件、注释后&#xff0c;输入“o”确认 在弹出框内…

班级文化建设方案分享 中学高中建设方案

班级文化建设方案 一、基本信息 名称&#xff1a;xxxx计划 时间&#xff1a;XXXX年XX月-XXXX年XX月 地点&#xff1a;[XXXXX] 参与人群&#xff1a;X班全体师生及家长 目的和宗旨&#xff1a;通过班级文化建设&#xff0c;营造积极向上的班级氛围&#xff0c;增强班级凝聚…

分布式数据库HBase(林子雨慕课课程)

文章目录 4. 分布式数据库HBase4.1 HBase简介4.2 HBase数据模型4.3 HBase的实现原理4.4 HBase运行机制4.5 HBase的应用方案4.6 HBase安装和编程实战 4. 分布式数据库HBase 4.1 HBase简介 HBase是BigTable的开源实现 对于网页搜索主要分为两个阶段 1.建立整个网页索引&#xf…

Zabbix 简介与部署

一、zabbix 简介 1、概念&#xff1a; Zabbix 是一个开源的网络监控系统&#xff0c;用于监视和管理计算机系统、网络和应用程序的性能和可用性。它提供了广泛的监控、警报、数据收集和可视化功能&#xff0c;能够有效地监测和管理大规模的IT基础设施。 2、监控对象&#xf…

github创建个人网页登录后404无法显示的问题

1.首先必须要有内容&#xff0c;默认是会找index.html文件&#xff0c;找不到该文件会找readme.md文件&#xff0c;也就是说最简单的方法是&#xff0c;创建了与用户名同名的repository后username.github.io后&#xff0c;添加一个readme.md文件&#xff0c;得在readme里打点字…