14

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

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

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

4

9 回答 9

11

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

于 2008-09-30T15:21:53.460 回答
6

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

这:

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

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

更新:JUnitExt@Category@Prerequisite注释,看起来它应该做你需要的。但是,我自己从未使用过它,所以我不能保证它。

于 2008-09-30T15:24:55.153 回答
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 {
}

当然,我真的应该让这些事情保持自动化。一个很好的方法是使用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>
于 2008-09-30T15:41:12.993 回答
1

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

于 2008-09-30T15:19:57.207 回答
0

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

于 2008-09-30T15:01:17.940 回答
0

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

于 2008-09-30T15:01:55.347 回答
0

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

于 2008-09-30T15:17:32.207 回答
0

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

我强烈推荐它而不是 JUnit。

于 2008-09-30T19:32:33.233 回答
0

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

于 2009-01-12T13:44:35.303 回答