我想让Jenkins作业运行一个ant任务来运行我的代码库中所有标记为@Ignore的测试,因为使用类似@Category(IgnoredTest.class)的注释不适用于我们的测试运行并行化。经过大量搜索后,它看起来可以撤销,但我仍然有希望。帮帮我?运行标记@Ignore的所有测试
JUnit的4.10
我想让Jenkins作业运行一个ant任务来运行我的代码库中所有标记为@Ignore的测试,因为使用类似@Category(IgnoredTest.class)的注释不适用于我们的测试运行并行化。经过大量搜索后,它看起来可以撤销,但我仍然有希望。帮帮我?运行标记@Ignore的所有测试
JUnit的4.10
我不确定你的“测试运行并行化”有什么障碍,但是如果你愿意使用自定义的“忽略”注释而不是JUnit,你可以通过规则来做到这一点一。原因是JUnit在Runner级别处理@Ignored测试,特别是在BlockJUnit4ClassRunner.runChild()
(默认情况下)。如果你能找到一种在Ant中使用自定义的Runner的方法,你可以想出一个方法来很容易地满足你的需求,但是我不知道在Ant中这很容易实现。
正如我第一次提到的那样,您可以轻松使用不同的注释和规则来选择要运行的方法。我编造了一个快速example of such a rule on github,以及a test that uses it。我的小示例使用系统属性进行切换,但您显然也可以将其切换为任何您能想到的事情,以便您可以在此处进行操作。
您可以克隆和运行这个例子:
git clone [email protected]:zzantozz/testbed tmp
cd tmp
mvn test -pl stackoverflow/9611070-toggleable-custom-ignore -q
mvn test -pl stackoverflow/9611070-toggleable-custom-ignore -q -D junit.invertIgnores
这种方法,我能想到的一个缺点是,你的测试将不会得到正确标记为“忽略”,因为,这也是通过做BlockJUnit4ClassRunner.runChild()
方法,如果您查看ParentRunner.runLeaf()
(其中包含runChild()
代表),您将看到通知程序(这是您需要报告忽略测试的内容)不会传递给规则所使用的程度。再一次,这是你需要一个自定义的亚军。
您可以创建一个特殊的Ant目标,消除@Ignore标注和添加@Ignore标注到任何活动@Test标注的方法
的目标将是这样的:
<project name="anyname" default="test" basedir=".">
..
..
<target name="enable-ignored-test" depends="copy-code-to-replace-ignored">
<fileset id="fsTestCase" dir="." includes="**/*Test.java">
</fileset>
<replaceregexp flags="gm">
<regexp pattern="^@Ignore"/>
<substitution expression=""/>
<fileset refid="${fsTestCase}"/>
</replaceregexp>
<replaceregexp flags="gm">
<regexp pattern="@Test"/>
<substitution expression="@Ignore @Test"/>
<fileset refid="${fsTestCase}"/>
</replaceregexp>
</target>
<target name="run-ignored-tests" depends="enable-ignored-test,test" />
..
..
</project>
这是可行的,不确定是否有现成的解决方案。从http://www.junit.org/node/592开始。您可以构建具有忽略注释的方法集合,然后使用这些方法调用方法运行器。 – Jayan 2012-03-08 07:03:27
谢谢,我会研究一下。 – compiledwrong 2012-03-16 23:44:22