是否有用于运行测试组的JUnit TestRunner?
我目前正在使用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。