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

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

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

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):按方法名称以字典顺序对测试方法进行排序。

验证码:

  1. @FixMethodOrder(MethodSorters.NAME_ASCENDING)
  2. public class ApplicationTest extends ActivityInstrumentationTestCase2<MainActivity> {
  3. public ApplicationTest() {
  4. super(MainActivity.class);
  5. }
  6. @Rule
  7. public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);
  8. @Test
  9. void t1AttachUI(){
  10. // testing code goes here
  11. }
  12. @Test
  13. void t2InitializeViews(){
  14. // testing code goes here
  15. };
  16. @Test
  17. void t3SettingValues(){
  18. // testing code goes here
  19. };
  20. @Test
  21. void t4Validation(){
  22. // testing code goes here
  23. };
  24. @Test
  25. void t3AfterButtonPress(){
  26. // testing code goes here
  27. };
  28. }
展开查看全部
mctunoxg

mctunoxg3#

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

de90aj5v

de90aj5v4#

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

  • src/test/resources/junit-platform.properties:*
  1. # ClassOrderer$OrderAnnotation sorts classes based on their @Order annotation
  2. junit.jupiter.testclass.order.default=org.junit.jupiter.api.ClassOrderer$OrderAnnotation

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

  1. org.junit.jupiter.api.ClassOrderer$ClassName
  2. org.junit.jupiter.api.ClassOrderer$DisplayName
  3. org.junit.jupiter.api.ClassOrderer$Random

您也可以提供自己的排序器。它必须实现ClassOrderer接口:

  1. package foo;
  2. public class MyOrderer implements ClassOrderer {
  3. @Override
  4. public void orderClasses(ClassOrdererContext context) {
  5. Collections.shuffle(context.getClassDescriptors());
  6. }
  7. }
  1. 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(因为我来这里是为了寻找答案)

展开查看全部

相关问题