我们有DAO测试应该针对真正的DAO /数据库和针对模拟dao运行,以验证模拟dao与真实dao的行为相同。为此,我们有这样的结构:
public abstract class DAOTestBase
{
public void testSimple()
{
// dummy assertion
assertTrue(true, "Hello");
}
}
@Test(groups = "fast")
public class TestMockDAO extends DAOTestBase
{
// setUp/tearDown and helper methods for mock
}
@Test(groups = "slow")
public class TestDAO extends DAOTestBase
{
// setUp/tearDown and helper methods for real DB
}
不幸的是,这不起作用 - TestNG认为testSimple
方法不是测试,因此不会运行它。所以我尝试注释testSimple
方法(或DAOTestBase
类):
没有任何群组的@Test
注释会产生相同的效果 - 不会对fast
或slow
群体进行测试。
使用群组@Test
和fast
的{{1}}注释会产生相反的效果 - 无论slow
和TestMockDAO
都会运行是否只应进行快速或慢速测试。
在TestDAO
和@Test
中使用其他组common
注释dependsOnGroups="common"
注释,加上TestMockDAO
个注释也不起作用除非TestDAO
包含在要运行的组中,这再次导致上述案例2(common
和TestMockDAO
都已运行)。
最后,我正在寻找的是一种能够为子类中的继承测试定义组的方法,但似乎TestDAO
注释仅应用于测试方法在同一个类中,也不是没有@Test
注释的继承方法。有没有其他方法可以实现这一点(不覆盖子类中的所有方法)?
答案 0 :(得分:2)
我目前正在处理类似情况。
使测试用例运行的一种方法是使用类似的东西:
@Test
public void someTest() {
TestNG testng = new TestNG();
testng.setTestClasses(new Class[] { SomeTests.class });
testng.run();
}
参考:http://testng.org/doc/documentation-main.html#running-testng-programmatically
不幸的是,我目前无法在 SomeTests 中报告测试用例。
答案 1 :(得分:1)
您是否尝试过在DAOTestBase上添加@Test
注释?每个子类都会用自己的组覆盖它,这应该使基础中的方法成为一种测试方法。
答案 2 :(得分:1)
我正在使用TestNG 6.14.3版本,并且找到了使用priority
批注的解决方案。
示例:
我有一个基础测试班:
public class TestBase {
@Test(priority = 0)
public void testA() {
assertTrue(true, "testA");
}
}
和另一个扩展的测试类:
public class Test2 extends TestBase {
@Test(priority = 1)
public void testB() {
assertTrue(true, "testB");
}
}
运行Test2
测试类时,获得以下结果:
testA: true
testB: true
答案 3 :(得分:0)
我这样解决了:
基类中的方法位于“基础”组中,但需要检查测试是否已初始化。
public abstract DaoTestBase {
private boolean initialized = false;
@Test(groups = "base")
public void testSimple() {
if (!initialized) { return; }
// dummy assertion
assertTrue(true, "Hello");
}
}
在子类中,在BeforeClass注释方法中初始化测试。
@BeforeClass
protected void initialize() {
super.initialized = true;
}
如果您注释父类而不是方法,则必须传递inheritGroups = false和组,因为它还继承了基类的组,但它不起作用。
现在,您必须运行TestNG以检查组base,fast或base,slow。两个测试都将被执行,但未初始化的测试将无效。
这很丑,我不推荐它(看起来更好的重新定义子方法并调用相应的超级方法),但在我的情况下,我需要优先考虑我的测试方法,我想避免重复在每个儿童班。