当前位置:网站首页 > 编程语言 > 正文

junit5和junit4的区别(junit和testng)



  • JDK 8 我只有JDK 17,所以改了下Language Level,保证不会使用新特性就行 (后面会讲,变异测试需要jdk8)
  • Junit 4.12(在pom.xml中已指定好)
  • 我用的是 IDEA,毕竟2024年mooctest比赛终于可以不用那个难用得要死的eclipse了
 
  

注意,一个Test方法只能测试一处异常。如果你想测试一个对象方法里会有的多个异常,还是只能分成多个测试方法分开测。

其实有个允许一个Test方法内测试多个异常的函数,但是是Junit5中的。通过参考23年省赛答案,我发现了答案中对assertThrows进行了自己的实现。

 
  
 
  
 
  

是使用 进行比较,比较两个引用是否指向堆上的同一个对象

第三个参数是指误差范围

 
  

查看源码可以发现就是差<=误差就行

 
  
 
  
 
  

输出为

 
  

众所周知测试肯定不能修改待测代码,但是对于只有 sout 的 void 方法,我们肯定也是要测试。我们可以通过输出重定向的方法捕获输出内容到变量中,然后 assert。

 
  
 
  

变异测试的原理就是,把待测代码(在字节码层面改)改一下,如果我们的测试代码的 assert 依然通过(即变异子存活),那说明代码存在问题。比如我们测试 这个减法函数,如果我们的 junit 写的是 ,那么变异子将subtract的减法改成加法,这个 assert 依然通过,说明咱们的测试存在疏漏。

我的理解是变异测试不是让开发人员自行对代码单元测试的,而是让测试人员完善测试用例的。

我们使用 pitest 这个工具进行测试。包在 pom.xml 里已经有了。

我们使用下面的命令启动测试。

 
  

注意如果版本 >= jdk9,会报错

所以就只能老老实实用 jdk8 了…

按下面这样配一个运行按钮,会方便一点。注意填入的命令是
在这里插入图片描述
运行成功后,查看即可
在这里插入图片描述


可能即便测 coverage 已经全部 pass 了,pitest 这里还是有报错

可能是因为多个方法共享的变量(如静态变量等)被修改导致测试不通过(虽然我也不知道是哪里有问题)。可以看下面的例子,各个Test方法是从上到下执行的,修改 cnt 会影响在另一个方法里的测试。

 
  

突变子列表,这个链接介绍了有哪些突变子以及对应做了什么突变。浏览一下可以方便我们看 index.html 里内容的时候知道是哪些变异子活下来了。

这些是运行 mutation 覆盖率测试时默认激活的 mutator:

 
  

也可以自行配置其他突变子,这会导致测试时间变长,但能发现更多问题。

 
  

在index.html中,悬停在红色数字上可以看到下面黄色区域的内容,就是对应行的存活变异子。

下面的例子就是说,第150行有两个变异子存活,即条件边界改变和条件取反。比如一个是变异成这种,一个是这种。我们就要针对这些情况再添加相关assert。
在这里插入图片描述

  • 某些情况可以多用循环,增加覆盖率的同时,也更好杀死变异体。
  • 先用 idea 的 diagram 看各个类的依赖关系,先覆盖最上层的类的方法,这样也会覆盖一些底层方法。如果先从底层类开始,会浪费时间。同时最好先提高覆盖率,再去弄变异测试,别花费时间在不提高分数的测试用例的编写上。
  • 尽量避免修改共享变量,如果一定要修改,尽量改后还原。
  • 注意判题标准。反正24年的是下面这样。所以不要只做覆盖率。然后各个Test方法把名称和注释都弄得可读性搞些。运行效率的话,虽然我上面说了可以用循环,但是感觉只要不写死循环就OK吧。
    在这里插入图片描述

    按以下五个维度进行评分。

    • (30%)分支覆盖率:代码分支覆盖率。
    • (30%)变异杀死率:参阅PIT工具网站指定的常见变异类型。
    • (20%)可读性与可维护性:参阅各大企业的测试同样指南进行评分。
    • (20%)脚本运行效率:针对该题为每个覆盖率区间给定一个基准时间,分数为(基准时间-运行时间)/基准时间。

    脚本编写效率:总分=上述分数累加,总分相同则按提交时间二次排序。


  • 可读性与维护性:可以使用这个插件检查代码,或者直接用 idea 的 problems 面板查看。建议最后留五分钟改改代码可读性。
    在这里插入图片描述
  • 打完预选赛,根本做不完分支覆盖,可能是我太菜了。所以变异覆盖率也只能靠做分支覆盖时多加几种边缘值assert顺便提升。真的没空专门弄变异覆盖。
到此这篇junit5和junit4的区别(junit和testng)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 广度优先搜索是什么搜索(广度优先搜索是什么搜索引擎)2025-09-20 16:27:11
  • 怎样拆包装袋线头(线装袋怎么拆)2025-09-20 16:27:11
  • 卸载程序快捷命令(快捷键打开卸载程序界面)2025-09-20 16:27:11
  • yml文件下载(yml文件不生效)2025-09-20 16:27:11
  • yuv444和yuv422哪个画质更好(yuv420和yuv444哪个画质更好)2025-09-20 16:27:11
  • 哔哩哔哩二维码登陆(哔哩哔哩二维码登陆在哪里)2025-09-20 16:27:11
  • 网页上聊天的平台叫什么(网页上聊天的平台叫什么名字)2025-09-20 16:27:11
  • 进程控制块(什么是进程控制块)2025-09-20 16:27:11
  • jfif是什么意思(jlf是什么意思)2025-09-20 16:27:11
  • 哔哩哔哩二维码登录的二维码在哪里找(哔哩哔哩二维码登录的二维码在哪里找到)2025-09-20 16:27:11
  • 全屏图片