任何方法之前的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
答案 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()语句的顺序。