答案是通过自定义org.testng.IMethodSelector:
它的includeMethod()可以排除我们想要的任何方法,比如公共的未注释方法。
但是,要注册自定义Java MethodSelector,您必须将其添加到任何 TestRunner 管理的XMLTest实例中,这意味着您需要自己的自定义 TestRunner。
但是,要构建自定义 TestRunner,您需要通过-testrunfactory选项注册一个TestRunnerFactory 。
但是TestNG类从不考虑 -testrunfactory ......所以您还需要定义一个自定义 TestNG 类:
- 为了覆盖 configure(Map) 方法,
- 所以你可以实际设置 TestRunnerFactory
- TestRunnerFactory 将为您构建一个自定义的 TestRunner,
- TestRunner 将为 XMLTest 实例设置一个自定义 XMLMethodSelector
- XMLMethodSelector 将构建一个自定义的 IMethodSelector
- IMethodSelector 将排除您选择的任何 TestNG 方法!
好吧……这是一场噩梦。但这也是一个代码挑战,所以一定有点挑战;)
所有代码都可以在DZone 片段中找到。
像往常一样进行代码挑战:
- 一个 java 类(和相当多的内部类)
- 将类复制粘贴到“源/测试”目录中(因为包是“测试”)
- 运行它(不需要参数)
迈克·斯通的更新:
我会接受这一点,因为它听起来非常接近我最终所做的,但我想我也会添加我所做的。
基本上,我创建了一个 Groups 注释,其行为类似于 Test(和其他)注释的 groups 属性。
然后,我创建了一个 GroupsAnnotationTransformer,它使用 IAnnotationTransformer 查看正在定义的所有测试和测试类,然后修改测试以添加组,这与组排除和包含完美配合。
修改构建以使用新的注释转换器,这一切都完美无缺!
嗯......一个警告是它不会将组添加到非测试方法......因为在我这样做的时候,有另一个注释转换器可以让你转换任何东西,但它不包括在内在我出于某种原因使用的TestNG中......所以最好让你的前/后注释方法总是运行=真......这对我来说已经足够了。
最终结果是我可以做到:
@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
@Test
@Groups("aMethodLevelGroup")
public void myTest() {
}
}
我让转换器与子类化和所有东西一起工作。