是否有用于运行测试组的JUnit TestRunner?

时间:2020-03-06 14:55:37  来源:igfitidea点击:

我目前正在使用JUnit 4,并且需要将测试分为几组,可以按任意组合有选择地运行这些测试。我知道TestNG具有注释测试以将其分配给组的功能,但是我现在不能迁移到TestNG。似乎可以在JUnit中使用一些自定义注释和自定义JUnit TestRunner轻松实现。我已经检查了两个JUnit文档并在网上搜索,但是找不到这样的东西。有人知道这样的TestRunner吗?

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

更新2:如果JUnit没有此OOB,我正在寻找一个开源库,将其添加到JUnit(注释+自定义JUnit Test Runner)。

解决方案

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

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

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

不,不幸的是,没有与TestNG组类似的概念。它是为JUnit4计划的,但由于某些不清楚的原因,已将其从计划中删除。

JUnit目前没有这样的运行程序。解决根本问题是,在有限的时间内从测试套件中获得合理保证的需求,是我们下一版本的最高开发优先事项。同时,尽管我有偏见,但实现通过注释工作的Filter似乎并不是一个大项目。

查看Spring的SpringJUnit4ClassRunner。我使用它来使用IfProfileValue批注(可选)基于System属性运行测试。

这:

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

如果系统属性"测试组"设置为"单元测试"或者"集成测试",则将运行。

更新:JUnitExt具有@ Category@ Prerequisite批注,看起来它应该可以满足需求。但是,我从来没有亲自使用过它,所以我不能担保它。

首先,我们要解决单元测试(通常与被测单元位于同一软件包中)和集成测试这两个问题。我通常将集成测试放在单独的程序包中,例如com.example.project.tests。在eclipse中,我的项目如下所示:

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

右键单击一个程序包,然后选择"运行"以运行该程序包中的测试;在源文件夹上执行相同的操作将运行所有测试。

通过使用Suite运行器,尽管我们对它不感兴趣,但我们可以实现类似的效果。但是,这违反了DRY,我们必须在套件类中保持测试名称的副本最新。但是,我们可以轻松地将同一测试放入多个套件中。

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

当然,我真的应该使这些事情自动化。一个很好的方法是使用Ant任务。

<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>

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

我强烈推荐使用JUnit。

我的建议是简单地抛弃JUnit并使用TestNG。一旦我们习惯了TestNG,Junit就会像Stone Age。