我有一个不稳定的 junit 测试,只有当我运行所有测试时才会失败。我认为一个测试导致另一个测试失败,我想在尝试修复它之前证明这一点。
如果我运行所有测试,它会运行“测试污染测试”,然后运行“测试污染后失败的测试”。它还在其间运行许多不相关的、缓慢的测试。但是,如果我使用一种模式只运行这两个,它会运行“测试污染后失败的测试”,然后运行“测试污染测试”。结果,都通过了。
如何按顺序只运行“测试污染测试”和“测试污染后失败的测试”?
注意:这些测试位于不同的班级中。
根据JUnit 的wiki:
按照设计,JUnit 没有指定测试方法的执行顺序 调用。到目前为止,这些方法只是按顺序调用 由反射 API 返回。然而,使用JVM顺序是不明智的 因为 Java 平台没有指定任何特定的顺序,并且 事实上 JDK 7 返回或多或少随机的顺序。当然, 编写良好的测试代码不会假定任何顺序,但有些会这样做,并且 在某些方面,可预测的故障优于随机故障 平台。
从版本 4.11 开始,JUnit 将默认使用确定性,但不使用 可预测,顺序(MethodSorters.DEFAULT)。更改测试 执行顺序只需使用 @FixMethodOrder 注释您的测试类 并指定可用的方法排序器之一:
:将测试方法保留在 JVM 返回的顺序。此顺序可能因运行而异。@FixMethodOrder(MethodSorters.JVM)
:对测试方法进行排序 按方法名称,按字典顺序排列。@FixMethodOrder(MethodSorters.NAME_ASCENDING)
您可以使用
MethodSorters.NAME_ASCENDING
并更改方法名称以匹配您的特定订单。我知道您使用它只是为了调试,但它是一个测试气味依赖于您的测试方法执行顺序,并且 JUnit 不提供对测试方法执行顺序更精细的控制
正如 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
};
}
单元测试应该是独立的,因此大多数框架不保证或强制它们的运行顺序。但是,由于您想要以最简单的方式强制执行命令,因此我过去曾这样做过,它创建一个“丢弃”测试套件或测试方法,以我希望它们运行的任何顺序调用测试。单元测试是方法,只需致电他们即可。如果您要处理数十个测试,这很容易做到,但如果您要处理数百或数千个测试,则完全没有吸引力。
尝试尽可能隔离片状交互,然后在一次性调用方法中交换交互不良的测试的顺序。
在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(因为我来这里是为了寻找答案)
只需添加一个方便的提示
您可以在 intellij 中定义运行配置的运行顺序,方法是按住 Ctrl 键并按要运行的顺序单击每个测试类,然后右键单击该类并选择运行测试 (Ctrl+Shift+F10)。如果您检查运行配置,它将使用“Pattern”作为资源类型,其值具有按照您选择的顺序排列的类:
com.example.Test1Class||com.example.Test2Class||com.example.Test3Class
这应该可以帮助你确认有关测试污染的理论