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

aor9mmx1  于 2023-10-15  发布在  其他
关注(0)|答案(4)|浏览(144)

我有一个只有在运行所有测试时才会失败的测试。我认为一个测试导致另一个测试失败,我想在尝试修复它之前证明它。
如果我运行所有测试,它运行“测试污染测试”,然后运行“测试污染后失败的测试”。它还在中间运行许多不相关的、缓慢的测试。但是如果我使用一个模式只运行这两个,它会运行“测试污染后失败的测试”,然后运行“测试污染测试”。结果,两者都通过了。
我如何只运行“测试污染测试”和“测试污染后失败的测试”,按此顺序?
注意:这些测试在不同的类中。

3z6pesqy

3z6pesqy1#

根据JUnit's wiki
根据设计,JUnit不指定测试方法调用的执行顺序。到目前为止,方法只是按照反射API返回的顺序调用。然而,使用JVM顺序是不明智的,因为Java平台没有指定任何特定的顺序,实际上JDK 7返回的顺序或多或少是随机的。当然,编写良好的测试代码不会假定任何顺序,但有些代码会,并且在某些平台上,可预测的失败比随机失败要好。
从4.11版开始,JUnit将默认使用确定性但不可预测的顺序(MethodSorters.DEFAULT)。要更改测试执行顺序,只需使用@FixMethodOrder注解测试类并指定可用的MethodSorters之一:
@FixMethodOrder(MethodSorters.JVM):按照JVM返回的顺序保留测试方法。该顺序可能因运行而异。
@FixMethodOrder(MethodSorters.NAME_ASCENDING):按照方法名称和字典顺序对测试方法进行排序。
您可以使用MethodSorters.NAME_ASCENDING并更改方法名称以匹配特定的顺序。我知道您只是为了调试而使用它,但是它依赖于您的测试方法执行顺序,并且JUnit没有提供对测试方法执行顺序的更细粒度的控制,这是一个测试测试方法

5rgfhyps

5rgfhyps2#

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

mctunoxg3#

单元测试应该是独立的,因此大多数框架不保证或强制执行它们的运行顺序。但是,既然你想强制执行一个顺序,我过去做过的最简单的方法是创建一个“扔掉”的测试套件或测试方法,它以我希望它们运行的任何顺序调用测试。单元测试是方法,只需调用它们。如果您要处理数十个测试,这很容易做到,如果您要处理数百个或数千个测试,这一点都不吸引人。
尝试尽可能地隔离测试间的交互,然后在一次性调用方法中交换交互性差的测试的顺序。

de90aj5v

de90aj5v4#

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 docs以了解更多信息。
来源:JUnit test class order
我建议注意:https://stackoverflow.com/a/68269239/10663941
方法顺序:https://www.baeldung.com/junit-5-test-order(因为我来这里是为了寻找答案)

相关问题