如何定义在 Intellij 中运行 junit 测试的顺序?

我有一个片状的 junit 测试,只有当我运行所有测试时才会失败。我认为一个测试导致另一个测试失败,我想在尝试修复它之前证明它。

如果我运行所有测试,它运行“错误设置”,然后运行“错误设置后失败的测试”。它还在两者之间运行许多不相关,缓慢的测试。但是,如果我使用一种模式来只运行这两个,它就会运行“在错误设置后失败的测试”,然后是“错误设置”。结果,两者都通过了。

如何按此顺序仅运行“错误设置”和“错误设置后失败的测试”?


答案 1

根据JUnit的维基

根据设计,JUnit 不指定测试方法调用的执行顺序。到目前为止,这些方法只是按照反射 API 返回的顺序调用的。但是,使用 JVM 顺序是不明智的,因为 Java 平台没有指定任何特定顺序,实际上 JDK 7 返回或多或少的随机顺序。当然,编写良好的测试代码不会假设任何顺序,但有些会,并且可预测的故障比某些平台上的随机故障更好。

从版本 4.11 开始,JUnit 将默认使用确定性但不可预测的顺序 (MethodSorters.DEFAULT)。要更改测试执行顺序,只需使用@FixMethodOrder对测试类进行批注,然后指定一个可用的 MethodSorters:

@FixMethodOrder(MethodSorters.JVM):将测试方法保留为 JVM 返回的顺序。此顺序可能因运行而异。

@FixMethodOrder(MethodSorters.NAME_ASCENDING):按方法名称按词典顺序对测试方法进行排序。

您可以使用和更改方法名称以匹配您的特定订单。我知道你只是为了调试而使用它,但它依赖于你的测试方法执行顺序是一种测试气味,JUnit没有提供对测试方法执行顺序的更细粒度的控制。MethodSorters.NAME_ASCENDING


答案 2

正如Ali Dehghani所说,您可以通过以下方式订购测试方法的执行

@FixMethodOrder(MethodSorters.NAME_ASCENDING):按方法名称按词典顺序对测试方法进行排序。

法典:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ApplicationTest extends ActivityInstrumentationTestCase2<MainActivity> {

    public ApplicationTest() {
        super(MainActivity.class);
    }

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    void t1AttachUI(){
        // testing code goes here
    }

    @Test
    void t2InitializeViews(){
        // testing code goes here
    };

    @Test
    void t3SettingValues(){
        // testing code goes here
    };

    @Test
    void t4Validation(){
        // testing code goes here
    };

    @Test
    void t3AfterButtonPress(){
        // testing code goes here
    };
}

推荐