JUnit测试控制@Test执行顺序的三种方式小结

 更新时间:2021年9月6日 16:00  点击:1790

JUnit测试控制@Test执行顺序

第一种

@FixMethodOrder(MethodSorters.JVM)

从上到下 执行@Test

第二种(推荐)

@FixMethodOrder(MethodSorters.NAME_ASCENDING) 

按方法名字顺序执行@Test

第三种

@FixMethodOrder(MethodSorters.DEFAULT)

默认方法,不可预期

Junit测试方法保证执行顺序

由于需要做自动化测试,所以需要比较完善的单元测试。但是又因为某些测试的执行依赖另外一个测试产生的结果,所以希望所写的test case按照自己希望的顺序来执行。

随后博主查阅资料发现了FixMethodOrder注解,可以有三种方式可以控制test执行顺序。

  /**
     * Sorts the test methods by the method name, in lexicographic order, with {@link Method#toString()} used as a tiebreaker
     */
    NAME_ASCENDING(MethodSorter.NAME_ASCENDING),
    /**
     * Leaves the test methods in the order returned by the JVM. Note that the order from the JVM may vary from run to run
     */
    JVM(null),
    /**
     * Sorts the test methods in a deterministic, but not predictable, order
     */
    DEFAULT(MethodSorter.DEFAULT);

大概上就是上面三种,很多大佬的博客上都对这几种有讲解以及示例,博主在这里就不啰嗦了,下面说一下我的一些疑问以及发现。

当使用默认排序时

@FixMethodOrder(MethodSorters.DEFAULT)
public class testDemo{
    
    @Test
    public void B(){
        System.out.println("b");
    }
    @Test
    public void C(){
        System.out.println("c");
    }
    @Test
    public void A(){
        System.out.println("a");
    }
    @Test
    public void AB(){
        System.out.println("ab");
    }
    @Test
    public void AC(){
        System.out.println("ac");
    }
    @Test
    public void A1(){
        System.out.println("a1");
    }
}

输出

a
b
c
a1
ab
ac

这只是博主众多测试结果中的一个,实际上与API中描述的“but not predictable”有所出入,执行的顺序是可预期的。

因为观察到,名字短的总排在前面,ascii码小的总在前面,所以博主猜测有可能顺序跟方法名字的字符串的hashcode有关的,于是加上hashcode方法输出之后,得到结果:

方法A:65
方法B:66
方法C:67
方法A1:2064
方法AB:2081
方法AC:2082

所以可以得出结论,当单元测试使用默认执行顺序的时候,测试方法执行的顺序是跟测试方法名字符串的hashcode大小线性相关。

Junit执行时应该是把所有的有@test注释的方法存到一个容器里,然后交由jvm去一一执行(博主还没来得及仔细去研读Junit的源码,这是本人的猜测)。那么问题来了,这一系列的方法是在同一个线程下还是多个线程一起执行的呢?

其实从测试的执行顺序可以控制不难猜出,多个测试方法是串行执行的,但是实践才是检验真理的唯一标准。

代码就不贴了,有兴趣的同学可以自己写一下看看,就是在第二顺位执行的方法那里让他休眠一下,观察是否也会阻塞第三个方法。

最终的结果也证明了猜想。

我现在看的还比较浅显,有时间的话会去研读Junit的底层源码。以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞

[!--infotagslink--]

相关文章

  • For循环中分号隔开的3部分的执行顺序探讨

    引发这个问题思考的是一段js程序的运行结果: 复制代码 代码如下: var i = 0; function a(){ for(i=0;i<20;i++){ } } function b(){ for(i=0;i<3;i++){ a(); } return i; } var Result = b(); 这段程序的运行结果是Re...2014-05-31
  • 浅谈Docker-compose中的depends_on顺序的问题解决

    本文主要介绍了浅谈Docker-compose中的depends_on顺序的问题解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-11-03
  • vue.js页面加载执行created,mounted的先后顺序说明

    这篇文章主要介绍了vue.js页面加载执行created,mounted的先后顺序说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-07
  • 解析c++中参数对象与局部对象的析构顺序的详解

    本篇文章是对c++中参数对象与局部对象的析构顺序进行了详细的分析介绍,需要的朋友参考下...2020-04-25
  • 浅谈mysql执行过程以及顺序

    这篇文章主要介绍了浅谈mysql执行过程以及顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-12
  • django中url映射规则和服务端响应顺序的实现

    这篇文章主要介绍了django中url映射规则和服务端响应顺序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-05-10
  • 对for循环中表达式和循环体的执行顺序详解

    今天小编就为大家分享一篇对for循环中表达式和循环体的执行顺序详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
  • 简单了解springboot加载配置文件顺序

    这篇文章主要介绍了简单了解springboot加载配置文件顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-11
  • MySQL语句执行顺序和编写顺序实例解析

    这篇文章主要介绍了MySQL语句执行顺序和编写顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-24
  • 基于springMVC web.xml中的配置加载顺序

    这篇文章主要介绍了springMVC web.xml中的配置加载顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-30
  • C#语句先后顺序对程序的结果有影响吗

    有朋友问我,C#中C#语句先后顺序影响程序的结果吗?告诉大家,答案是肯定的,绝对影响程序的结果,所以在程序中一定要注意C#语句的顺序...2020-06-25
  • ASP.NET 页面事件执行顺序介绍

    当页面进行回发时,如点击按钮,以上事件都会重新执行一次,这时的执行顺序为OnPreInit、OnInit、OnInitComplete等等,感兴趣的朋友可以参考下哈...2021-09-22
  • jquery调整表格行tr上下顺序实例讲解

    这篇文章主要为大家介绍了jquery调整表格行tr上下顺序实例,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-01-12
  • 关于C#执行顺序带来的一些潜在问题

    这篇文章主要给大家介绍了关于C#执行顺序带来的一些潜在问题,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-11-03
  • Oracle Faq(如何在ORACLE中更改表的列名和顺序 )

    如需转载,请注明出处! 用过ORACLE的人都知道,要想在ORACLE中更改表的列名和顺序可是一件很烦琐的事,下面给大家提供一种简单的方法。 SQL> select object_id from all_obj...2016-11-25
  • C++聚合关系类的构造函数的调用顺序详解

    下面小编就为大家带来一篇C++聚合关系类的构造函数的调用顺序详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧...2020-04-25
  • C++程序的执行顺序结构以及关系和逻辑运算符讲解

    这篇文章主要介绍了C++程序的执行顺序结构以及关系和逻辑运算符讲解,是C++入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • pandas调整列的顺序以及添加列的实现

    这篇文章主要介绍了pandas调整列的顺序以及添加列的实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-27
  • C++ 程序抛出异常后执行顺序说明

    这篇文章主要介绍了C++ 程序抛出异常后执行顺序说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-25
  • Shell脚本中多命令逻辑执行顺序的方法详解

    Linux中可以使用分号“;”、双and号“&&”和双竖线“||”来连接多个命令,这篇文章主要介绍了Shell脚本中多命令逻辑执行顺序的方法,本文给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友参考下...2020-07-11