排除不修改测试类个人JUnit测试方法?(Exclude individual JUnit Test

2019-07-04 11:39发布

我从JUnit的对我的代码的另一个项目4个测试目前使用的再。 我直接获得他们从其他项目库作为我的自动化Ant构建的一部分。 这是伟大的,因为它确保我把我的代码绿色表示反对这些测试的最新版本。

然而,有一种我从来没有想到过我的代码测试的一个子集。 但是,如果我开始增加@Ignore注释这些测试,我将不得不保持测试实现,我真的不想做我自己的单独副本。

有没有排除个别测试,而无需修改测试源的一种方式? 以下是我已经看过至今:

  • 据我所看到的,蚂蚁junit任务只允许您以排除整个测试类,而不是单个的测试方法 - 所以这是不适合我,我需要方法的粒度。

  • 我考虑放在一起,使用反射动态地查找并添加所有的原始测试,然后添加代码来显式删除我不想运行的测试一个TestSuite。 但是,我抛弃了这个想法的时候,我注意到, TestSuite的API不提供用于去除测试的方法。

  • 我可以创建扩展原有的测试类我自己的测试类,覆盖特定的测试中,我不想跑,并与@Ignore注释它们。 然后,我在我的子类运行JUnit。 这里的缺点是,如果新的测试类被添加到原来的项目,我也不会自动接他们回家。 我必须监测新的测试类,因为它们添加到原始项目。 这是我最好的选择,到目前为止,但感觉并不理想。

  • 我能想到的唯一的另一种选择是想运行测试不好而忽略了失败。 然而,这些测试需要一段时间才能运行(和失败!),所以我宁愿不运行它们。 此外,我看不出告诉Ant任务来忽略具体的测试方法失败的方式(再次 - 我看你怎么可以单独测试类做到这一点,但不是方法)。

Answer 1:

如果你不能在所有接触到原件测试,你将会有一些严重的局限性。 你压倒一切听起来就像是最好的选择,但有一些改动:

建立特别不包括超类蚂蚁的测试,从而使其他类,你不知道车子撞到。

您可以使用@rule注释(新的JUnit 4.7)知道什么测试正在运行,并终止它(通过返回一个空语句执行),而不是覆盖具体方法,让你在知道是否要避免测试更多的灵活性。 用这种方法唯一的问题是,你不能使用这种方法,这可能是缓慢停止运行的@Before方法。 如果这是一个问题(和你真的不能碰测试)在重写的方法则是@Ignore我能想到的唯一的事情。

但是,如果你可以触摸这些测试,一些附加选项打开:

你可以通过指定的类@RunWith标签具有可定制的运行运行它们。 这会亚军刚刚执行过到该项目中的标准亚军(JUnit4.class),但在你的项目中(通过设置系统属性或一些其他机制)将检查测试名称,而不是运行测试。 这具有侵入性最小的优势,但最难以实现(亚军是毛茸茸的野兽的@rule的既定目标之一是消除大部分的需要,使他们)。

另一种方法是使对会检查一些配置设置,如果该测试应该运行,这将是真正的测试的assumeThat声明。 这实际上涉及到注射直接进入测试,这是最有可能在任何一个大忌远程贴上了“单独的项目。”



Answer 2:

它不会帮你了,但TestNG的支持这种能力。



Answer 3:

OK,这是一个相当重量级的解决方案,但在我,如果这听起来可笑不乱扔东西。

Junit4的核心是org.junit.runner.Runner类,它的不同子类中,最重要的org.junit.runners.Suite 。 这些选手确定哪些测试是针对给定的测试类,使用像@Test和@Ignore。

这是很容易地创建一个亚军的定制实现,通常你会使用挂钩起来@RunWith在你的测试类注释,但显然这不是一个选择。

然而,从理论上讲,你可以编写自己的Ant任务,也许在标准Ant junit任务,这需要您自定义的测试运行,并直接使用它,只要通过考试类它反过来为主。 您亚军的实现可以使用外部配置文件指定要忽略的测试方法。

这将会是一个相当大量的工作,你不得不花时间在史前蚂蚁的Junit代码库周围挖掘,找出它是如何工作的。 在时间的投资可能是值得的,但是。

这只是一个耻辱的是,Junit的Ant任务不提供一种机制来指定测试运行,这将是理想的。



Answer 4:

我能想到的实现要与陈述约束是什么一种可能性是使用字节码修改。 你可以保持的类和方法的列表在一个单独的文件中忽略,和补丁的测试类的字节码,你加载它们完全取消这种方法。

如果我没有记错的话,JUnit使用反射来找到测试方法来执行。 再一种方法,重命名操作将使你的JUnit发现他们之前删除这些方法。 或者,该方法可以进行修改,以立即返回,而不进行任何操作。

像库BCEL可用于加载时修改的类。



Answer 5:

如果你想只运行测试的一个子集,它听起来就像是类有多个职责,并应进行重构了。 或者测试类可能发生破碎,使原来的项目把所有的测试,但对一个或多个类(我猜一些测试的是真正的集成测试和触摸数据库或网络)和您可以排除类( ES)你不想。

如果你不能做任何的是,你的首要选择的可能是最好的。 就拿每当你需要忽略一些方法你继承了该类并将其添加到您的蚂蚁排除列表的过程。 这样,你可以排除你不能通过什么,仍然会拉在所有新的测试(方法,你没有重载和新的测试类),而无需修改您的构建。



Answer 6:

如果不需要的测试是在特定的类/包,你可以使用一个文件集中蚂蚁排除导入期间要排除他们。



Answer 7:

两个选项

  1. 用借来测试的老板工作,你的那些提取到一个单独的类你都可以分享。
  2. 创建自己的测试类代理要使用的测试类。 对于要包括每一种方法在你的类中的方法。 你需要前后方法来构造您所呼叫的测试类的实例,并做太多,如果他们在原来的。
  3. 创建基于blockjunitrunner一个自定义的JUnit运行,并用它来过滤掉或你想要的测试。


文章来源: Exclude individual JUnit Test methods without modifying the Test class?