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

我有一个片状的junit测试,只有在我运行所有测试时才会失败。 我认为一个测试导致另一个测试失败,我想在我尝试修复之前certificate它。

如果我运行所有测试,它会运行“错误设置”,然后运行“错误设置后失败的测试”。 它还会在两者之间运行很多无关紧要的慢速测试。 但是,如果我使用一个模式只运行这两个,它运行“测试失败后设置失败”然后“错误设置”。 结果,两个都通过了。

如何按顺序运行“错误设置”和“在错误设置后测试失败”?

根据JUnit的维基 :

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

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

@FixMethodOrder(MethodSorters.JVM) :按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 { public ApplicationTest() { super(MainActivity.class); } @Rule public ActivityTestRule 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 }; } 

unit testing应该是独立的,因此大多数框架不保证或强制执行它们的顺序。 但是,由于你想以最简单的方式强制执行命令,所以我创建了一个“扔掉”测试套件或测试方法,以我希望它们运行的​​任何顺序调用测试。unit testing是方法,打电话给他们。 如果您正在处理数十项测试,这很容易做到,如果您要处理数百或数千次测试,这一切都没有吸引力。

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