如何使用Junit按顺序运行测试方法

9
我正在使用JUnit和Selenium Webdriver。我想按照代码中的顺序运行我的测试方法,如下所示:
@Test
public void registerUserTest(){
    // code
}

@Test
public void welcomeNewUserTest(){
    // code
}

@Test
public void questionaireNewUserTest(){
    // code
}

但是它不起作用,它总是按照这个顺序执行我的测试方法:
welcomeNewUserTest()
registerUserTest()
questionaireNewUserTest()

我曾在某处读到一个答案,如果我将我的方法命名为Test后缀,那么JUnit会按照我在代码中的顺序执行它们。显然,这种方法不起作用。

有什么帮助吗?谢谢。


3
如果我理解您的情境正确的话,那么这是一种不好的测试方法 - 您的测试应该彼此独立。 - Dmitry Zaytsev
@DmitryZaitsev:是的,我知道。因为我正在编写验收测试,而且它非常大,所以我只是尝试将其分解成小的测试方法。试着看看Junit是否能按顺序运行它们。 - Ragnarsson
1
可能是如何在JUnit4中按特定顺序运行测试方法?的重复问题。 - Jared Hooper
4个回答

8

对于这样依赖于彼此步骤的测试,你应该把它们作为一个整体来执行。你应该这样做:

@Test
public void registerWelcomeAndQuestionnaireUserTest(){
    // code
    // Register
    // Welcome
    // Questionnaire
}

就像@Jeremiah在下面提到的那样,有一些独特的方式可以使分离的测试不可预测地执行。

既然我已经说了,这里是你的解决方案。

如果你想要分离的测试,你可以使用@FixMethodOrder,然后通过NAME_ASCENDING实现。这是我知道的唯一方法。

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestMethodOrder {

    @Test
    public void testA() {
        System.out.println("first");
    }
    @Test
    public void testC() {
        System.out.println("third");
    }
    @Test
    public void testB() {
        System.out.println("second");
    }
}

将执行:

testA(),testB(),testC()

在您的情况下:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ThisTestsEverything{

    @Test
    public void T1_registerUser(){
        // code
    }

    @Test
    public void T2_welcomeNewUser(){
        // code
    }

    @Test
    public void T3_questionaireNewUser(){
        // code
    }

}

1
谢谢。我按照你说的方法执行它们作为一个整体,我只是想知道是否有这个机会。而且@FixMethodOrder也可以工作。就像我所寻找的那样。谢谢。我之前不知道这个。 - Ragnarsson
@LouisT 哈哈,很棒你们都改变了方法,现在有解决方案了,如果需要的话。 - Jared Hooper
1
使用排序注释时需要记住的一件事是,它仍然可能会根据测试的执行方式而出现问题。例如,如果您使用SureFire,则需要在该配置中定义RunOrder:http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#runOrder 此外,如果您使用可以将多线程引入测试的执行工具(例如Maven),则您的测试可能会再次无序执行。我不确定这一点,但如果您开始看到意外结果,这值得记住。 - Jeremiah

2

您不能按照编写顺序运行测试方法。

重点是测试必须相互独立。JUnit不鼓励依赖测试。

但是,如果您非常想要...

有@FixMethodOrder注释。请阅读以下FixMethodOrder注释类型


1
你可以使用@FixMethodOrder(MethodSorters.NAME_ASCENDING)注解来对方法进行排序。例如,
@FixMethodOrder(MethodSorters.DEFAULT)
public class DefaultOrderOfExecutionTest {

private static StringBuilder output = new StringBuilder("");

@Test
public void secondTest() {
    output.append("b");
}

@Test
public void thirdTest() {
    output.append("c");
}

@Test
public void firstTest() {
    output.append("a");
}

@AfterClass
public static void assertOutput() {
    assertEquals(output.toString(), "cab");
}
}

你可以通过以下3种方式进行排序:
1. MethodSorters.DEFAULT - 这是默认策略,它使用测试方法的哈希码进行比较。在哈希冲突的情况下,使用字典顺序。
2. MethodSorters.JVM - 这个策略利用了自然的JVM排序方式,每次运行可能不同。
3. MethodSorters.NAME_ASCENDING - 这个策略可以按照字典顺序运行测试。
更多详细信息请参考:JUnit中的测试顺序

-1
请在执行测试的类上方使用以下命令。
@FixMethodOrder(MethodSorters.JVM)
public class TestMethodOrder {

    @Test
    public void signup() {
        System.out.println("Signup");
    }

    @Test
    public void login() {
        System.out.println("Login");
    }

    @Test
    public void navigate() {
        System.out.println("Navigate");
    }
}

MethodSorters.JVM 注解将按照您在文件中实际编写的方式执行测试。(就像 Java 代码一样,逐行执行)


1
这是错误的。JVM返回的方法顺序可能在每次运行时都不同。在文档(https://junit.org/junit4/javadoc/4.12/org/junit/runners/MethodSorters.html#JVM)中:public static final MethodSorters JVM:按JVM返回的顺序保留测试方法。请注意,JVM的顺序可能会因为运行而异。 - Jared Hooper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接