【问题标题】:How do I define an order to run junit tests in Intellij?如何定义在 Intellij 中运行 junit 测试的顺序?
【发布时间】:2015-12-24 18:42:14
【问题描述】:

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

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

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

【问题讨论】:

  • 你应该修复测试
  • @Lashane 我需要知道解决测试的问题。这个问题是关于了解问题所在。
  • 通常“调试”是解决它的方法,运行所有测试,找到它失败的地方,在前面放置断点 - 找出它实际失败的原因,导致它的状态/变量,找到它的位置状态改变,放置断点并再次运行所有测试
  • @Lashane 我通常会这样做,但在这种情况下,调试此问题的效率极低。

标签: java intellij-idea junit integration-testing


【解决方案1】:

根据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 并更改您的方法名称以匹配您的特定订单。我知道您只是为了调试而使用它,但它是 Test Smell 依赖于您的测试方法执行顺序,并且 JUnit 没有对测试方法执行顺序提供更精细的控制

【讨论】:

  • 酷,这很有帮助。最后,我只是手动将@Ignore 放在所有内容上(暂时)
  • 这对这种情况没有帮助,因为这个问题跨越多个类。
【解决方案2】:

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

【讨论】:

  • 这对这种情况没有帮助,因为这个问题跨越多个类。
  • 命名 t1, t2, ... 只能工作到 t9。命名 t01, t02, ... 直到 t99。
【解决方案3】:

单元测试应该是独立的,因此大多数框架不保证或强制执行它们的运行顺序。但是,由于您想以我过去做过的最简单的方式执行命令,因此它创建了一个“丢弃”测试套件或测试方法,该测试套件或测试方法以我希望它们运行的​​任何顺序调用测试。单元测试是方法,打电话给他们。如果您要处理数十个测试,这很容易做到,但如果您要处理成百上千个测试,这将毫无吸引力。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 2011-04-03
    • 2012-03-28
    相关资源
    最近更新 更多