【问题标题】:Is there a JUnit TestRunner for running groups of tests?是否有用于运行测试组的 JUnit TestRunner?
【发布时间】:2008-09-30 14:58:18
【问题描述】:

我目前正在使用 JUnit 4,并且需要将我的测试分成可以以任何组合有选择地运行的组。我知道 TestNG 具有注释测试以将它们分配给组的功能,但我现在无法迁移到 TestNG。似乎这可以通过一些自定义注释和自定义 JUnit TestRunner 在 JUnit 中轻松完成。我已经检查了 JUnit 文档并搜索了网络,但找不到这样的东西。有人知道这样的 TestRunner 吗?

更新:感谢您对测试套件的回复。我应该在我原来的问题中解决这些问题。让我们开始吧:我不想使用测试套件,因为它们需要我手动创建和管理它们,这意味着我要手动处理我的所有测试并将它们安排到套件中(太多的工作和维护的噩梦)。我需要做的就是运行所有的单元测试,除了一些真正的集成测试。所以我想注释这些,并运行所有其他的。在其他时候,我只想运行集成测试。我还需要将单元测试放入多个组中,这在套件中是不可能的。希望这有助于解决问题。

更新 2:如果 JUnit 没有此 OOB,我正在寻找将其添加到 JUnit 的开源库(注释 + 自定义 JUnit 测试运行器)。

【问题讨论】:

标签: java unit-testing junit


【解决方案1】:

JUnit 目前没有这样的跑步者。解决根本问题,需要在有限的时间内从测试套件中获得合理保证,这是我们下一个版本的最高开发优先级。与此同时,实现一个通过注释工作的过滤器似乎不是一个大项目,尽管我有偏见。

【讨论】:

  • 感谢 Kent,您一针见血地指出了根本问题;很高兴听到这将在下一个 JUnit 版本中解决。你也是对的,我写这样一个过滤器的启动时间可能比你的长一点,因为你共同编写了 JUnit :) 不过我会调查一下。
  • 这里是 Filter 类 JavaDoc 的链接:junit.sourceforge.net/javadoc/org/junit/runner/manipulation/…
【解决方案2】:

查看 Spring 的 SpringJUnit4ClassRunner。我已经使用它来选择性地运行基于 System 属性的测试,使用 IfProfileValue 注释。

这个:

@IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"})
  public void testWhichRunsForUnitOrIntegrationTestGroups() {
      // ...
 }

如果系统属性 'test-groups' 设置为 'unit-tests' 或 'integration-tests' 将运行。

更新:JUnitExt 具有 @Category@Prerequisite 注释,看起来应该可以满足您的需求。但是,我自己从未使用过它,所以我不能保证它。

【讨论】:

  • 谢谢,这两个看起来很有希望。我去看看。
  • SpringJUnit4ClassRunner 本来可以工作的,但是我们使用的是没有这个的旧版本的 Spring。在我们更新之前(在一个巨大的项目中并不容易),我不能使用这种方法。
  • 注意:Spring @IfProfileValue跳过/忽略测试如果名称和值不匹配并且它不不运行 它。如果你想用这个实现 JUnit 类别类型的实现,你可能需要最终将 SpringJUnit4ClassRunner#runChild 扩展为 not-run 而不是 ignoring。如果它的结果​​在詹金斯中,这主要很重要。
【解决方案3】:

首先,您要解决两个问题 - 单元测试(通常与被测单元在同一个包中)和集成测试。我通常将集成测试保存在一个单独的包中,例如 com.example.project.tests。在 Eclipse 中,我的项目如下所示:

project/
  src/
    com.example.project/
  tsrc/
    com.example.project/
    com.example.project.tests/

右键单击一个包并选择“运行”运行包中的测试;对源文件夹执行相同操作会运行所有测试。

您可以通过使用Suite runner 来获得类似的效果,尽管您对此表示不感兴趣。但是,这违反了 DRY - 您必须在套件类中保持测试名称的副本是最新的。但是,您可以轻松地将相同的测试放在多个套件中。

@RunWith(Suite.class)
@Suite.SuiteClasses( { 
    TestAlpha.class, 
    TestBeta.class })
public class GreekLetterUnitTests {
}

当然,我真的应该让这些事情保持自动化。这样做的一个好方法是使用the Ant task

<target name="tests.unit">
  <junit>
    <batchtest>
      <fileset dir="tsrc">
        <include name="**/Test*.java"/>
        <exclude name="**/tests/*.java"/>
      </fileset>
    </batchtest>
  </junit>
</target>
<target name="tests.integration">
  <junit>
    <batchtest>
      <fileset dir="tsrc">
        <include name="**/tests/Test*.java"/>
      </fileset>
    </batchtest>
  </junit>
</target>

【讨论】:

    【解决方案4】:

    不,遗憾的是,没有与 TestNG 组类似的概念。它是为 JUnit4 计划的,但由于一些不清楚的原因,它被从计划中删除了。

    【讨论】:

      【解决方案5】:

      您可以创建套件,尽管这会将所有配置放在套件中,而不是在注释中。

      【讨论】:

        【解决方案6】:

        JUnit 3 允许您创建可以像任何其他测试一样运行的测试套件。 JUnit 4 不是有类似的概念吗?

        【讨论】:

          【解决方案7】:

          如果您使用的是 ANT 或 maven,您可以通过按名称过滤测试来控制运行哪些测试。有点尴尬,但它可能对你有用。

          【讨论】:

            【解决方案8】:

            TestNG 有我的投票。它基于注解,可以作为组、单个测试等运行,可以链接到 Maven,并且可以运行所有 JUnit 测试作为其测试运行的一部分。

            我强烈推荐它而不是 JUnit。

            【讨论】:

              【解决方案9】:

              我的建议只是放弃 JUnit 并使用 TestNG。一旦你习惯了 TestNG,Junit 看起来就像石器时代。

              【讨论】:

                猜你喜欢
                • 2011-08-06
                • 1970-01-01
                • 2013-12-09
                • 2019-07-05
                • 1970-01-01
                • 2015-06-10
                • 2021-12-16
                • 2018-08-19
                • 1970-01-01
                相关资源
                最近更新 更多