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

问题描述 投票:0回答:5

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

如果我运行所有测试,它会运行“测试污染测试”,然后运行“测试污染后失败的测试”。它还在其间运行许多不相关的、缓慢的测试。但是,如果我使用一种模式只运行这两个,它会运行“测试污染后失败的测试”,然后运行“测试污染测试”。结果,都通过了。

如何按顺序只运行“测试污染测试”和“测试污染后失败的测试”?

注意:这些测试位于不同的班级中。

java intellij-idea junit integration-testing
5个回答
34
投票

根据JUnit 的wiki

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

从版本 4.11 开始,JUnit 将默认使用确定性,但不使用 可预测,顺序(MethodSorters.DEFAULT)。更改测试 执行顺序只需使用 @FixMethodOrder 注释您的测试类 并指定可用的方法排序器之一:

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

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

您可以使用

MethodSorters.NAME_ASCENDING
并更改方法名称以匹配您的特定订单。我知道您使用它只是为了调试,但它是一个测试气味依赖于您的测试方法执行顺序,并且 JUnit 不提供对测试方法执行顺序更精细的控制


7
投票

正如 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
    };
}

3
投票

单元测试应该是独立的,因此大多数框架不保证或强制它们的运行顺序。但是,由于您想要以最简单的方式强制执行命令,因此我过去曾这样做过,它创建一个“丢弃”测试套件或测试方法,以我希望它们运行的任何顺序调用测试。单元测试是方法,只需致电他们即可。如果您要处理数十个测试,这很容易做到,但如果您要处理数百或数千个测试,则完全没有吸引力。

尝试尽可能隔离片状交互,然后在一次性调用方法中交换交互不良的测试的顺序。


1
投票

JUnit 5(从版本5.8.0开始)也可以订购测试类。

src/test/resources/junit-platform.properties

# ClassOrderer$OrderAnnotation sorts classes based on their @Order annotation
junit.jupiter.testclass.order.default=org.junit.jupiter.api.ClassOrderer$OrderAnnotation

其他 Junit 内置类排序器实现:

org.junit.jupiter.api.ClassOrderer$ClassName
org.junit.jupiter.api.ClassOrderer$DisplayName
org.junit.jupiter.api.ClassOrderer$Random

您还可以提供自己的订购者。它必须实现 ClassOrderer 接口:

package foo;
public class MyOrderer implements ClassOrderer {
    @Override
    public void orderClasses(ClassOrdererContext context) {
        Collections.shuffle(context.getClassDescriptors());
    }
}
junit.jupiter.testclass.order.default=foo.MyOrderer

请注意,

@Nested
测试课程不能由
ClassOrderer
订购。

请参阅 JUnit 5 文档 和 ClassOrderer API 文档 以了解更多相关信息。

来源:JUnit测试类顺序

我建议关注:https://stackoverflow.com/a/68269239/10663941

方法顺序:https://www.baeldung.com/junit-5-test-order(因为我来这里是为了寻找答案)


0
投票

只需添加一个方便的提示
您可以在 intellij 中定义运行配置的运行顺序,方法是按住 Ctrl 键并按要运行的顺序单击每个测试类,然后右键单击该类并选择运行测试 (Ctrl+Shift+F10)。如果您检查运行配置,它将使用“Pattern”作为资源类型,其值具有按照您选择的顺序排列的类:

com.example.Test1Class||com.example.Test2Class||com.example.Test3Class

这应该可以帮助你确认有关测试污染的理论

© www.soinside.com 2019 - 2024. All rights reserved.