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


    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依赖

    
        org.mockito
        mockito-core
        3.5.0
    
    
        org.mockito
        mockito-inline
        4.5.1
        test
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4.2 生成用例

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

    在这里插入图片描述

    在弹窗中选择testMe。

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    5、自定义模板

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    /**
     * @author author
     * @date ${DATE} ${TIME}
     */
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

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

    import org.junit.runner.RunWith;
    import org.mockito.runners.MockitoJUnitRunner;
    
    • 1
    • 2

    在这里插入图片描述

    第三我们添加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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

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

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    7、调试用例

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

    在这里插入图片描述

  • 相关阅读:
    Kotlin 预备知识
    7-FreeRTOS软件定时器
    Java入门------static关键字和静态属性、方法
    DataFrame的创建
    期货十三篇 第七篇 平仓篇
    ORACLE在系统级别修改PDB
    二维码智慧门牌管理系统:智能化地址管理,提升社会治理效率
    AWS SAP-C02教程11-解决方案
    代码随想录一刷打卡——.二叉树的层次遍历(十题特别版)
    DataNode进入Stale状态问题排查
  • 原文地址:https://blog.csdn.net/mingyonghu/article/details/133749782