我有一个片状的junit测试,只有在我运行所有测试时才会失败。我认为一个测试导致另一个测试失败,我想在我尝试修复之前证明它。
如果我运行所有测试,它会运行"错误设置"然后它运行"测试在设置错误后失败"。它还会在两者之间运行许多无关紧要的慢速测试。但是,如果我使用一个模式只运行这两个模式,它运行"测试在设置错误后失败"然后"糟糕的设置"。结果,两个都通过了。
我如何只运行"设置错误"并且"在错误的设置"之后按顺序测试失败?
答案 0 :(得分:25)
根据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没有提供对测试方法执行顺序更精细的颗粒控制
答案 1 :(得分:4)
正如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
};
}
答案 2 :(得分:1)
单元测试应该是独立的,因此大多数框架不保证或强制执行它们的顺序。但是,由于你想要以最简单的方式强制执行命令,所以我创建了一个“扔掉”测试套件或测试方法,以我希望它们运行的任何顺序调用测试。单元测试是方法,只需打电话给他们。如果您正在处理数十项测试,这很容易做到,如果您要处理数百或数千次测试,这一切都没有吸引力。
尝试尽可能地隔离片状交互,然后在一次性调用方法中交换不良交互测试的顺序。