2012-03-08 58 views
3

我想让Jenkins作业运行一个ant任务来运行我的代码库中所有标记为@Ignore的测试,因为使用类似@Category(IgnoredTest.class)的注释不适用于我们的测试运行并行化。经过大量搜索后,它看起来可以撤销,但我仍然有希望。帮帮我?运行标记@Ignore的所有测试

JUnit的4.10

+1

这是可行的,不确定是否有现成的解决方案。从http://www.junit.org/node/592开始。您可以构建具有忽略注释的方法集合,然后使用这些方法调用方法运行器。 – Jayan 2012-03-08 07:03:27

+0

谢谢,我会研究一下。 – compiledwrong 2012-03-16 23:44:22

回答

0

我不确定你的“测试运行并行化”有什么障碍,但是如果你愿意使用自定义的“忽略”注释而不是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()代表),您将看到通知程序(这是您需要报告忽略测试的内容)不会传递给规则所使用的程度。再一次,这是你需要一个自定义的亚军。

0

您可以创建一个特殊的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> 
相关问题