我可以在TestNG测试用例中指定一个类宽组吗?

Mik*_*one 13 java testng

我有一个基类代表TestNG中的数据库测试,我想指定从这个类扩展的所有类都是"db-test"组,但我发现这似乎不可行.我试过@Test注释:

@Test(groups = { "db-test" })
public class DBTestBase {
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为@Test注释会尝试将一堆方法转换为测试,并且在运行测试时会在eclipse中弹出警告/错误.

所以我尝试禁用测试,因此至少分配了组:

@Test(enabled = false, groups = { "db-test" })
public class DBTestBase {
}
Run Code Online (Sandbox Code Playgroud)

但是任何@BeforeTest(和其他类似的注释)也会被禁用......这当然不是我想要的.

我想用某种方法将类注释为特定类型的组,但在TestNG中似乎不太可能.有没有人有任何其他想法?

Von*_*onC 2

答案是通过自定义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 snippets中找到。

像往常一样,进行代码挑战:

  • 一个java类(以及相当多的内部类)
  • 将类复制粘贴到“source/test”目录中(因为包是“test”)
  • 运行它(不需要参数)

迈克·斯通更新:

我将接受这一点,因为它听起来非常接近我最终所做的事情,但我想我也会添加我所做的事情。

基本上,我创建了一个 Groups 注释,其行为类似于 Test(和其他)注释的 groups 属性。

然后,我创建了一个 GroupsAnnotationTransformer,它使用 IAnnotationTransformer 查看所有定义的测试和测试类,然后修改测试以添加组,这与组排除和包含完美配合。

修改构建以使用新的注释转换器,一切都完美运行!

嗯...需要注意的是,它不会将组添加到非测试方法中...因为在我这样做时,还有另一个注释转换器可以让您转换任何内容,但不知何故它没有包含在内在我出于某种原因使用的 TestNG 中...所以最好将之前/之后带注释的方法设置为alwaysRun=true...这对我来说就足够了。

最终结果是我能做到:

@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
    @Test
    @Groups("aMethodLevelGroup")
    public void myTest() {
    }
}
Run Code Online (Sandbox Code Playgroud)

我让变压器可以与子类化和其他一切一起工作。