排除单个JUnit测试方法而不修改Test类?
我目前正在针对我的代码重用另一个项目中的JUnit
4测试。我可以从其他项目的资源库中直接获取它们,这是我的自动化Ant构建的一部分。这很棒,因为它可以确保我的代码相对于最新版本的测试保持绿色。
但是,有一些测试子集我从未期望通过我的代码。但是,如果我开始在这些测试中添加@Ignore批注,则必须维护我自己的测试实现的单独副本,而我
不想这样做。
有没有办法在不修改测试源的情况下排除单个测试?到目前为止,这是我看过的内容:
据我所知,Ant JUnit任务仅允许您排除整个Test类,而不是单个测试方法-因此这对我不利,我需要方法粒度。
我考虑将一个TestSuite放在一起,它使用反射功能来动态查找并添加所有原始测试,然后添加代码以显式删除我不想运行的测试。但是当我发现TestSuite API没有提供删除测试的方法时,我放弃了这个想法。
我可以创建自己的Test类,以扩展原始Test类,覆盖我不想运行的特定测试,并使用@Ignore对其进行注释。然后,我在子类上运行JUnit。这里的缺点是,如果将新的Test类添加到原始项目中,我将不会自动选择它们。当新的Test类添加到原始项目中时,我将不得不对其进行监视。到目前为止,这是我最好的选择,但并不理想。
我唯一想到的另一种选择是无论如何都要运行不良测试并忽略故障。但是,这些测试需要一段时间才能运行(并且失败!),所以我宁愿完全不运行它们。另外,我看不到一种告诉Ant任务忽略特定测试方法失败的方法(再次-我看到了如何为单个Test类(而不是方法)做到这一点)。
回答:
如果您根本无法触摸原始测试,那么您将受到一些严重的限制。您的压倒一切听起来是最好的选择,但有一些更改:
专门构建排除超级类的Ant测试,以便运行您不了解的其他类。
您可以使用@Rule批注(JUnit
4.7的新增功能)来了解正在运行的测试并中止测试(通过返回空的Statement实现),而不是重写特定的方法,从而使您在了解是否避免测试方面拥有更大的灵活性。
。此方法的唯一问题是您无法停止使用此方法运行@Before方法。如果这是一个问题(并且您真的无法通过测试),那么我只能想到重写方法中的@Ignore。
但是,如果您可以触摸这些测试,则会打开一些其他选项:
您可以通过在类上指定@RunWith标记,使用自定义运行程序来运行它们。该运行程序只是将执行传递给该项目中的标准运行程序(JUnit4.class),但在您的项目中(通过系统属性或其他某种机制)将检查测试名称而不运行测试。这样做的好处是侵入性最少,但实施起来最困难(流浪者是毛茸茸的野兽,@
Rule的既定目标之一是消除制造它们的大部分需求)。
另一种方法是在测试中做出一个that语句,该语句将检查某些配置设置,如果该测试应运行,则该设置为true。实际上,这实际上涉及向测试中注入权利,这很可能成为远程标记为“单独项目”的任何事物的破坏因素。
以上是 排除单个JUnit测试方法而不修改Test类? 的全部内容, 来源链接: utcz.com/qa/406785.html