7种单元测试工具测评结果,看看哪款适合你们

最近诺怀软件公司调研了一下java后端单元测试的工具,这里总结一下优缺点供参考。

本次调研了这几种工具:diffblue, squaretest, Auto Unit Test Case Generator, Randoop, testme, 腾讯云AI代码助手,MarsCode AI

这些工具都可以自动生成测试代码,测试代码都是基于junit的,我们的单元测试也都是基于junit框架的。

(本文是原创文章,严禁转载)

一、Diffblue

形式:idea插件,安装插件后,在java代码文件左侧会有对应的图标按钮,点击后即可生成此类(此函数)的单元测试代码

注意:运行diffblue有最低jdk版本限制(最低版本1.8.0_351)

特点:

  • 生成的测试代码,函数参数是直接new出来的
  • 会针对函数返回值检查部分字段

缺点:

  • 要收费,社区版每个月只能测试25个函数
  • 不会进行mock

小结:因为要收费,免费版额度很少,所以不考虑在我们开发环境使用。

二、Squaretest

形式:idea插件,安装插件后,在java代码文件中鼠标右键,菜单中有Generate项(我们的generate getter setter就是从这个菜单进去的),里面有”Generate Test”和“Generate Test - Confirm Options”两个选项,都可以生成测试代码,可以选择模板文件。

注意:试用30天,网上有破解方法

特点:

  • 生成的测试代码,会试用mock(比如汉得框架里的Repository或者Mabatis mapper对象)
  • 函数参数的构造,比较完善(每个字段都会设值,不像其他部分工具,直接new一个参数就完了,参数里各个字段都没设值)

缺点:

  • 有试用期(但是可以忽略)
  • 假设某个类原本有5个函数,生成了测试代码,然后在类里增加一个函数,再次生成测试代码,会发现生成无效(需要手动把老测试文件改名或删除)

部分截图如下

小结:表现较好,可以考虑在开发过程中使用

三、Auto Unit Test Case Generator

 

形式:独立程序,通过命令行使用(也有线下安装idea插件的方式)

特点:

  • 被测试代码必须先正常编译,在target/classes目录下通过命令行生成测试代码

缺点:

  • github上最后提交时间是3年前,基本没人维护了
  • 命令行使用不方便,有坑(有时生成测试代码会莫名其妙报错)

小结:不建议使用

四、Randoop

 

形式:独立程序,通过命令行使用

特点:

  • 这个工具会分析代码分支,并根据代码分支编写对应用例(感觉这一点很厉害)
  • 生成的用例的量非常大(其他工具,生成测试用例代码时,基本一个函数只会生成一个用例)

缺点:

  • 命令行使用不方便,特别是要手动指定classpath(即被测试代码所依赖的jar要把路径放到命令行里面)很不方便
  • 生成的用例的量非常大,每次生成都会覆盖原用例

小结:不太适用于增删查改类的逻辑,而非常适用于计算类的逻辑。特别是工具会分析代码分支,自动构造正确的测试用例。例如待测试函数如下:

public int func(int a, int b){

  if(a<0 || b<0){

    return a*b;

  }else{

    return a+b;

  }

}

Randoop生成测试用例时,会自动创建正数或负数参数,并给出正确的期望值:

int int6 = mathServiceImpl0.func((-10), (-10));

org.junit.Assert.assertTrue("'" + int6 + "' != '" + 100 + "'", int6 == 100);

五、Testme

 

形式:idea插件,安装插件后在java文件里右键菜单Generate里面会有testme的菜单可以生成测试代码

缺点:

  • 生成的代码无法正确设值泛型,生成的测试代码非常简陋(函数参数只有new,不设值任何字段的值)

小结:不建议使用

六、腾讯云AI代码助手

 

形式:idea插件,AI对话方式,在对话中通过/tests命令来生成测试代码

特点:

  • 生成的测试代码,会使用mock
  • 生成的测试代码,会在一定程度上包含一些边界条件或者计算溢出的用例
  • 生成的代码,参数准备不是很全面(比如函数有个参数是一个类对象,内部有10个字段,使用此工具生成的代码可能会设值其中的6个字段,而不会10个字段都设值)
  • AI的答复中不止包含单元测试代码,可能还包含一些启发性的内容

缺点:

1,不像squaretest那样直接就生成测试代码文件,而是在对话框中回复代码,需要自己创建类文件

部分截图如下

小结:总体表现较好,不止可以生成测试代码,还可以用于代码错误检查。推荐使用。

七、MarsCode AI(豆包)

 

形式:idea插件,AI对话方式,在对话中通过/test命令来生成测试代码

特点:

  • 生成的测试代码,会使用mock
  • 生成的代码,参数准备很简单(可能是直接new出来的对象,而不会设值其中的字段)

缺点:

  • 不像squaretest那样直接生成测试代码文件,而是在对话框中回复代码,需要自己创建类文件
  • 会重复生成多次测试代码,一次回复可能会重复3次代码内容
  • 默认生成的测试代码使用的是junit5框架的(汉得平台默认使用的是junit4)
  • 测试时对话框中只能响应一次/test命令,不能再次发送对话

小结:不建议使用

总结:

1,增删查改类的功能,推荐使用腾讯云AI代码助手来生成测试用例

2,非增删查改类的功能(比如计算逻辑),推荐使用Randoop来生成测试用例

注意:

1,本次测试,只测试了部分我看到的工具,可能还有其他一些工具,如果发现其他工具更好用,欢迎补充

2,上述各种工具,除了Randoop,其他工具都会使用Mockito.verify来进行验证。Verify只是一种行为验证(某个函数的确被调用了,调用了几次),而不是状态验证(比如最终数据库里是否新增了或修改了数据,最终数据是否正确)。如果各物业java模块要测试service层的功能,可能需要进行状态验证。如果要进行状态验证,就需要手动修改测试用例了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值