运行标记为@Ignore的所有测试

时间:2012-03-08 00:00:11

标签: ant junit junit4

我想让Jenkins的工作是运行一个ant任务来运行我的代码库中标记为@Ignore的所有测试,因为使用像@Category(IgnoredTest.class)这样的注释不能用于我们的测试运行并行化。经过大量的搜索,它看起来很难以解决,但我仍然有希望。救命?

JUnit 4.10

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

我不确定您的&#34;测试运行并行化&#34;的障碍是什么,但如果您愿意使用自定义和&#34;,您可以通过规则执行此操作#34;忽略&#34;注释而不是JUnit。原因是JUnit在Runner级别处理@Ignored测试,特别是BlockJUnit4ClassRunner.runChild()(默认情况下)。如果你能找到一种在Ant中使用自定义Runner的方法,你可以很容易地想出一个满足你需求的方法,但我不知道这在Ant中是否容易实现。

正如我首先提到的,您可以轻松使用不同的注释和规则来选择要运行的方法。我快速example of such a rule on github以及a test that uses it。我的小例子使用了一个系统属性进行切换,但是你也可以明显地让它切换到你能想到的任何东西,你可以在这里开始。

您可以使用以下命令克隆并运行此示例:

git clone git@github.com: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

我能想到的这种方法的一个缺点是你的测试没有被正确标记为&#34;被忽略&#34;因为这也是通过BlockJUnit4ClassRunner.runChild()方法完成的,如果您偷看ParentRunner.runLeaf()runChild()个代表),您会看到通知程序,即你需要报告被忽略的测试,是不是传递得足以被规则使用。同样,它是你需要定制Runner for。

的东西