在不修改Test类的情况下排除单个JUnit Test方法?

rew*_*wbs 7 java ant junit junit4

我目前正在使用另一个项目中的JUnit 4测试来反对我的代码.作为自动化Ant构建的一部分,我直接从其他项目的存储库中获取它们.这很棒,因为它可以确保我的代码在最新版本的测试中保持绿色.

但是,有一部分测试我从未希望传递给我的代码.但是如果我开始在这些测试中添加@Ignore注释,我将不得不维护自己的测试实现的单独副本,我真的不想这样做.

有没有一种方法可以在不修改测试源的情况下排除单个测试?这是我到目前为止所看到的:

  • 据我所知,Ant JUnit任务只允许你排除整个Test类,而不是单独的测试方法 - 这对我没有好处,我需要方法粒度.

  • 我考虑整合一个TestSuite,它使用反射来动态查找和添加所有原始测试,然后添加代码以显式删除我不想运行的测试.但是当我注意到TestSuite API没有提供删除测试的方法时,我放弃了这个想法.

  • 我可以创建自己的Test类来扩展原始的Test类,覆盖我不想运行的特定测试,并使用@Ignore注释它们.然后我在我的子类上运行JUnit.这里的缺点是,如果将新的测试类添加到原始项目中,我将不会自动选择它们.我将不得不监视新的Test类,因为它们被添加到原始项目中.到目前为止,这是我最好的选择,但感觉并不理想.

  • 我能想到的唯一另一个选择是无论如何都要运行错误的测试并忽略失败.但是,这些测试需要一段时间才能运行(并且失败!)所以我宁愿根本不运行它们.另外,我看不到告诉Ant任务忽略特定测试方法失败的方法(再次 - 我看看如何为单个测试类而不是方法执行此操作).

Yis*_*hai 4

如果您根本无法接触原始测试,那么您将受到一些严重的限制。您的首要任务听起来是最好的选择,但有一些变化:

构建专门排除超类的 Ant 测试,以便运行您不知道的其他类。

您可以使用 @Rule 注释(JUnit 4.7 的新功能)来了解正在运行的测试并中止它(通过返回空的 Statement 实现),而不是覆盖特定方法,从而让您更灵活地了解是否要避免测试。此方法的唯一问题是您无法阻止使用此方法运行 @Before 方法,这可能会很慢。如果这是一个问题(并且您确实无法触及测试),那么重写方法中的 @Ignore 是我唯一能想到的。

但是,如果您可以触及这些测试,则会出现一些其他选项:

您可以通过在类上指定 @RunWith 标签来使用自定义运行器运行它们。该运行程序只会将执行传递给该项目中的标准运行程序 (JUnit4.class),但在您的项目中(通过系统属性或某种其他机制)将检查测试名称而不运行测试。这样做的优点是侵入性最小,但最难实现(跑步者是毛茸茸的野兽,@Rule 的既定目标之一是消除大部分制作它们的需要)。

另一种方法是在测试中创建一个假设语句,该语句将检查一些配置设置,如果该测试应该运行,这些设置是否为真。这实际上会涉及到直接注入到测试中,这很可能会破坏任何远程标记为“单独项目”的项目。