我有一个基类代表TestNG中的数据库测试,我想指定从这个类扩展的所有类都是“db-test”组,但我发现这似乎不可行。我试过@Test注释:
@Test(groups = { "db-test" })
public class DBTestBase {
}
然而,这不起作用,因为@Test注释会尝试将一堆方法用于测试,并且在运行测试时会在eclipse中弹出警告/错误。
所以我尝试禁用测试,因此至少分配了组:
@Test(enabled = false, groups = { "db-test" })
public class DBTestBase {
}
然后任何@BeforeTest(和其他类似的注释)也会被禁用......这当然不是我想要的。
我想用某种方法将类注释为特定类型的组,但在TestNG中似乎不太可能。有没有人有其他想法?
答案 0 :(得分:2)
TestNG将使用@Test注释从类中运行所有公共方法。也许你可以改变你不希望TestNG运行的方法是非公开的
答案 1 :(得分:2)
答案是通过自定义 org.testng.IMethodSelector :
includeMethod()可以排除我们想要的任何方法,例如公开的未注释方法。
但是,要注册自定义 Java MethodSelector,必须将其添加到由任何TestRunner管理的 XMLTest 实例,这意味着您需要自己的自定义TestRunner 强>
但是,要构建自定义TestRunner,您需要通过 -testrunfactory 选项注册 TestRunnerFactory 。
但 TestNG 类绝对不会考虑-testrunfactory ...所以你还需要定义一个自定义的TestNG类:
好吧......这是一场噩梦。但它也是一个代码挑战,所以它必须有点挑战;)
所有代码均可在DZone snippets处获得。
像往常一样代码挑战:
来自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类的所有测试方法而不用:
第一个答案很简单:
在基类级别添加一个类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);
}
}
这是否适合您,或者我遗漏了您的问题。