经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » JUnit » 查看文章
JUnit测试控制@Test执行顺序的三种方式小结
来源:jb51  时间:2021/9/6 13:21:12  对本文有异议

JUnit测试控制@Test执行顺序

第一种

  1. @FixMethodOrder(MethodSorters.JVM)

从上到下 执行@Test

第二种(推荐)

  1. @FixMethodOrder(MethodSorters.NAME_ASCENDING)

按方法名字顺序执行@Test

第三种

  1. @FixMethodOrder(MethodSorters.DEFAULT)

默认方法,不可预期

Junit测试方法保证执行顺序

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

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

  1.   /**
  2. * Sorts the test methods by the method name, in lexicographic order, with {@link Method#toString()} used as a tiebreaker
  3. */
  4. NAME_ASCENDING(MethodSorter.NAME_ASCENDING),
  5. /**
  6. * Leaves the test methods in the order returned by the JVM. Note that the order from the JVM may vary from run to run
  7. */
  8. JVM(null),
  9. /**
  10. * Sorts the test methods in a deterministic, but not predictable, order
  11. */
  12. DEFAULT(MethodSorter.DEFAULT);

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

当使用默认排序时

  1. @FixMethodOrder(MethodSorters.DEFAULT)
  2. public class testDemo{
  3. @Test
  4. public void B(){
  5. System.out.println("b");
  6. }
  7. @Test
  8. public void C(){
  9. System.out.println("c");
  10. }
  11. @Test
  12. public void A(){
  13. System.out.println("a");
  14. }
  15. @Test
  16. public void AB(){
  17. System.out.println("ab");
  18. }
  19. @Test
  20. public void AC(){
  21. System.out.println("ac");
  22. }
  23. @Test
  24. public void A1(){
  25. System.out.println("a1");
  26. }
  27. }

输出

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的底层源码。以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号