但是,有一部分测试我从未希望传递给我的代码.但是如果我开始将@Ignore注释添加到那些测试中,我将不得不维护我自己的测试实现的单独副本,我真的不想这样做.
有没有一种方法可以在不修改测试源的情况下排除单个测试?这是我到目前为止所看到的:
>据我所知,Ant JUnit任务只允许你排除整个Test类,而不是单独的测试方法 – 这对我没有好处,我需要方法粒度.
>我考虑整合一个TestSuite,它使用反射来动态查找和添加所有原始测试,然后添加代码以显式删除我不想运行的测试.但是当我注意到TestSuite API没有提供删除测试的方法时,我放弃了这个想法.
>我可以创建自己的Test类来扩展原始的Test类,覆盖我不想运行的特定测试,并使用@Ignore注释它们.然后我在我的子类上运行JUnit.这里的缺点是,如果将新的测试类添加到原始项目中,我将不会自动选择它们.我将不得不监视新的Test类,因为它们被添加到原始项目中.到目前为止,这是我最好的选择,但感觉并不理想.
>我能想到的唯一其他选择是无论如何都要运行错误的测试并忽略失败.但是,这些测试需要一段时间才能运行(并且失败!)所以我宁愿根本不运行它们.另外,我看不到告诉Ant任务忽略特定测试方法失败的方法(再次 – 我看你如何为单个测试类而不是方法).
解决方法
构建特别排除超类的Ant测试,以便运行您不了解的其他类.
您可以使用@Rule注释(JUnit 4.7的新增内容)来了解正在运行的测试并中止它(通过返回空的Statement实现)而不是覆盖特定的方法,让您在知道是否避免测试时更灵活.此方法的唯一问题是您无法使用此方法停止运行@Before方法,这可能很慢.如果这是一个问题(你真的无法触及测试),那么在重写方法中的@Ignore是我唯一能想到的.
但是,如果您可以触摸这些测试,则会打开一些其他选项:
您可以通过在类上指定@RunWith标记来使用自定义运行器运行它们.这个运行器只会将执行传递给该项目中的标准运行程序(JUnit4.class),但是在您的项目中(通过系统属性或其他一些机制)将检查测试名称而不运行测试.这样做的优点是侵入性最小,但最难实现(跑步者是毛茸茸的野兽,@ Rule的既定目标之一是消除制造它们的大部分需求).
另一种方法是在测试中做一个假设的声明,它将检查一些配置设置,如果该测试应该运行则该设置是真的.这实际上涉及注入测试,这很可能是任何远程标记为“单独项目”的交易破坏者.