【问题标题】:JUnit parameterized tests: how do I run only 1 specific test from IntelliJ/Eclipse?JUnit 参数化测试:如何仅从 IntelliJ/Eclipse 运行 1 个特定测试?
【发布时间】:2013-05-07 04:57:18
【问题描述】:

我有一个产生 50 个测试的 @Parameterized junit 测试:

@RunWith(Parameterized.class)
public class NurseRosteringSolveAllTurtleTest ... {

    @Parameterized.Parameters(name = "{index}: {0}")
    public static Collection<Object[]> getSolutionFilesAsParameters() {
        return ... // returns 50 Files.
    }

    public NurseRosteringSolveAllTurtleTest(File unsolvedDataFile) {
        ...
    }

    ...

    @Test
    public void solveDataFile() {
        ...
    }

}

运行它需要一个小时(而且不可能缩短那个时间,它们是集成测试)。测试 28 失败。

如何单独运行测试 28,而不运行其他 49 个测试?在不更改实际代码的情况下,只需在 IntelliJ(或 Eclipse)的运行配置中配置 -D 或类似的东西。

【问题讨论】:

  • 我看到您的问题得到了回应:“没有固定的方法可以做到这一点,因此将其作为功能请求。”:-(跨度>
  • 截至 2021 年 IntelliJ 的任何解决方案?

标签: java eclipse junit intellij-idea


【解决方案1】:

我刚刚在 Eclipse 中使用一个简单的参数化测试对此进行了测试,该测试总是在测试 #4 中失败。可以右键单击失败的测试并选择运行。然后只执行该测试。

结果:

令人沮丧的是,我看不到 Eclipse 为解决这个问题做了什么。运行配置中没有任何明显改变。特别是,如果您选择第二次运行配置,它将执行所有测试。

一些进一步的测试表明 Eclipse 将重新生成所有 10 个参数值,但只使用第 4 个值。 (这是通过在@Parameters 方法中嵌入打印语句来确定的。

【讨论】:

  • 不知道为什么有人会否决这个答案,因为这是一个非常有趣的线索。问题是 eclipse 是否破解了它,或者它是否使用了 JUnit 4 的未知环境变量。在后一种情况下,我们应该能够在 IntelliJ/Eclipse 运行配置中手动模仿它。
  • @GeoffreyDeSmet 我认为这对于 Eclipse 邮件列表来说可能是一个很好的问题。
【解决方案2】:

Eclipse 现在(从 Mars M4 版本开始)不仅能够运行 Parameterized 测试类中的单个测试,还能够运行任何类型的子树。

这可以是:

  • @Parameterized-method 返回的单个数据集的所有方法
  • 单个@Test-method 的所有数据集

如前所述,也可以通过在启动配置中的“方法”文本字段中输入测试名称来指定测试。会有一个标记表明该方法不存在,但测试仍然会运行。

详情请见this blog post

【讨论】:

    【解决方案3】:

    不确定它是否会有所帮助,但您可以尝试一个我在 Eclipse 和 JUnit 参数化测试中使用的技巧。

    在“测试方法”字段中的 JUnit 启动配置中,您可以编写参数化测试的全名,在您的示例中,它应该类似于“solveDataFile[28: /path/to/your/file]”。 Eclipse 会抱怨该方法不存在,但仍会成功午餐。

    【讨论】:

    • 感谢准确的语法。
    【解决方案4】:

    对于测试子集 ex(27 & 28),只需添加:

    `.subList( startInclusive, stopExclusive );`
    

    在返回您的参数集合之前。

    非连续子集:

    Collection<Object[]> c = Arrays.asList( data ).subList( startInclusive, stopExclusive );
    c.add( another subset );
    return c;
    

    【讨论】:

      【解决方案5】:

      类似于 Miguel 的回答,如果您使用的是 JUnit 5

      @ParameterizedTest
      @CsvFileSource(resources = arrayOf("/sender.csv"))
      

      您可以转到您的 csv 文件并通过在前面添加 # 字符来“注释掉”某些行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 2018-07-20
        相关资源
        最近更新 更多