zoukankan      html  css  js  c++  java
  • 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的底层源码。这篇随笔如果有什么错误,欢迎大家留言指正!

  • 相关阅读:
    Docker简介,安装,配置
    Centos7给 root 账户开通ssh权限
    [转载]Hyper-v 安装CentOS 7
    软件开发_六大原则
    php函数名后冒号(:)+数据类型(返回值类型限制/php新特性)
    MySQL--事务介绍
    MySQL存储引擎
    leetcode刷题笔记300题 最长上升子序列
    leetcode刷题笔记299题 猜数字游戏
    **leetcode刷题笔记四 两个有序序列的中位数**
  • 原文地址:https://www.cnblogs.com/winv758241/p/9512053.html
Copyright © 2011-2022 走看看