junit构造函数在测试方法之后运行

时间:2016-11-03 21:03:08

标签: java junit junit4

任何方法之前的AFAIK,构造函数方法由JRE运行。 但就我而言,构造函数在测试方法之后运行。

import org.junit.*;
public class CourseTest {

    public CourseTest(){
        System.out.println("Constructor");
    }

    @BeforeClass
    public static void beforeClassTest() throws Exception{
        System.out.println("beforeClassTest");
    }

    @AfterClass
    public static void afterClassTest() throws Exception{
        System.out.println("afterClassTest");
    }

    @Before
    public void beforeTest() throws Exception{
        System.out.println("beforeTest");
    }

    @After
    public void afterTest() throws Exception{
        System.out.println("afterTest");
    }


    @Test
    public void getCredit() throws Exception {
        System.out.println("test 1 is getCredit");

    }

    @Test
    public void getName() throws Exception {
        System.out.println("test 2 is getName");
    }
}

结果是:

beforeTest
test 2 is getName
afterTest
beforeTest
test 1 is getCredit
afterTest
beforeClassTest
Constructor
Constructor
afterClassTest

不仅如此,我的测试用例也以相反的顺序运行。 很困惑。 我理解为什么构造函数运行两次,因为对于每个测试,都会实例化一个新类。但是如何在测试方法之后运行构造函数?

修改: 正如@ mike-jenkins建议的那样,我调试了测试类,它按以下顺序运行:

1-beforeClassTest
2-Constructor
3-beforeTest
4-test 2 is getName
5-afterTest
6-Constructor
7-beforeTest
8-test 1 is getCredit
9-afterTest
10-afterClassTest

1 个答案:

答案 0 :(得分:3)

由于JUnit框架管理(内部)并行运行测试,因此无法保证JUnit测试的执行顺序。 这是为了使测试执行更快,当您在CI(持续集成)环境中构建应用程序时,这将特别有用,其中必须为整个应用程序运行数千个测试。

如果您想控制执行顺序,可以使用@FixMethodOrder注释,如下所示:

 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
 public class MyTest {
    //your test code here
 }
  

类中JUnit测试的默认执行顺序是   确定性但不可预测。执行顺序不是   保证Java 7(以及一些以前的版本),甚至可以   从运行更改为运行,因此执行顺序已更改为   确定性的(在JUnit 4.11中)

您可以查看here

由于存在多个测试用例,构造函数将被多次调用(由JUnit框架创建的不同线程并行执行)。

当多个线程正在运行时,构造函数的System.out.prinln()(实际上是任何日志)无法保证它将始终首先打印(即使它已被首先调用) 。 总之,在多线程环境中,您无法预测日志和System.out.println()语句的顺序。