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

时间:2008-08-12 16:52:09

标签: java testng

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

@Test(groups = { "db-test" })
public class DBTestBase {
}

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

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

@Test(enabled = false, groups = { "db-test" })
public class DBTestBase {
}

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

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

5 个答案:

答案 0 :(得分:2)

TestNG将使用@Test注释从类中运行所有公共方法。也许你可以改变你不希望TestNG运行的方法是非公开的

答案 1 :(得分:2)

答案是通过自定义 org.testng.IMethodSelector

includeMethod()可以排除我们想要的任何方法,例如公开的未注释方法。

但是,要注册自定义 Java MethodSelector,必须将其添加到由任何TestRunner管理的 XMLTest 实例,这意味着您需要自己的自定义TestRunner

但是,要构建自定义TestRunner,您需要通过 -testrunfactory 选项注册 TestRunnerFactory

TestNG 类绝对不会考虑-testrunfactory ...所以你还需要定义一个自定义的TestNG类:

  • 为了覆盖configure(Map)方法,
  • 所以你可以实际设置TestRunnerFactory
  • TestRunnerFactory将为您构建自定义的TestRunner,
  • TestRunner,它将XMLTest实例设置为自定义XMLMethodSelector
  • 将构建自定义IMethodSelector的XMLMethodSelector
  • IMethodSelector将排除您选择的任何TestNG方法!

好吧......这是一场噩梦。但它也是一个代码挑战,所以它必须有点挑战;)

所有代码均可在DZone snippets处获得。

像往常一样代码挑战:

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

来自Mike Stone的更新:

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

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

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

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

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

最终结果是我能做到:

@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
    @Test
    @Groups("aMethodLevelGroup")
    public void myTest() {
    }
}

我使用子类化和所有内容使变换器工作。

答案 2 :(得分:1)

我不确定注释继承如何为TestNG工作,但这个article可能有用。

实际上,这可能是help better,请查看inheritGroups。

答案 3 :(得分:1)

在我看来,以下代码挑战(社区维基文章):

如何能够从'aGlobalGroup'组执行Extended类的所有测试方法而不用:

  • 在Extended类本身上指定'aGlobalGroup'组?
  • 测试Extended class的非注释公共方法?

第一个答案很简单:
在基类级别添加一个类TestNG(groups = {“aGlobalGroup”})

该组将适用于Base类和Extended类的所有公共方法。

但是:即使是非testng公共方法(没有TestNG注释)也将包含在该组中。

挑战:避免包含那些非TestNG方法。

@Test(groups = { "aGlobalGroup" })
public class Base {

    /**
     * 
     */
    @BeforeClass
     public final void setUp() {
           System.out.println("Base class: @BeforeClass");
     }


    /**
     * Test not part a 'aGlobalGroup', but still included in that group due to the class annotation. <br />
     * Will be executed even if the TestNG class tested is a sub-class.
     */
    @Test(groups = { "aLocalGroup" })
     public final void aFastTest() {
       System.out.println("Base class: Fast test");
     }

    /**
     * Test not part a 'aGlobalGroup', but still included in that group due to the class annotation. <br />
     * Will be executed even if the TestNG class tested is a sub-class.
     */
    @Test(groups = { "aLocalGroup" })
     public final void aSlowTest() {
        System.out.println("Base class: Slow test");
        //throw new IllegalArgumentException("oups");
     }

     /**
      * Should not be executed. <br />
      * Yet the global annotation Test on the class would include it in the TestNG methods...
     */
    public final void notATest() {
       System.out.println("Base class: NOT a test");
     }

    /**
     * SubClass of a TestNG class. Some of its methods are TestNG methods, other are not. <br />
     * The goal is to check if a group specify in the super-class will include methods of this class. <br />
     * And to avoid including too much methods, such as public methods not intended to be TestNG methods.
     * @author <a href="http://stackoverflow.com/users/6309/vonc">VonC</a>
     */
    public static class Extended extends Base
    {
        /**
         * Test not part a 'aGlobalGroup', but still included in that group due to the super-class annotation. <br />
         * Will be executed even if the TestNG class tested is a sub-class.
         */
        @Test
        public final void anExtendedTest() {
           System.out.println("Extended class: An Extended test");
        }

        /**
         * Should not be executed. <br />
         * Yet the global annotation Test on the class would include it in the TestNG methods...
         */ 
        public final void notAnExtendedTest() {
            System.out.println("Extended class: NOT an Extended test");
        }
    }

答案 4 :(得分:0)

您可以在方法级别指定@Test注释,以实现最大的灵活性。

public class DBTestBase {

    @BeforeTest(groups = "db-test")
    public void beforeTest() {
        System.out.println("Running before test");
    }

    public void method1() {
        Assert.fail(); // this does not run. It does not belong to 'db-test' group.
    }

    @Test(groups = "db-test")
    public void testMethod1() {
        Assert.assertTrue(true);
    }
}

这是否适合您,或者我遗漏了您的问题。