TestNG测试继承和组

时间:2011-10-10 03:25:22

标签: java inheritance testng grouping

我们有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注释会产生相同的效果 - 不会对fastslow群体进行测试。

  • 使用群组@Testfast的{​​{1}}注释会产生相反的效果 - 无论slowTestMockDAO都会运行是否只应进行快速或慢速测试。

  • TestDAO@Test中使用其他组common注释dependsOnGroups="common"注释,加上TestMockDAO个注释也不起作用除非TestDAO包含在要运行的组中,这再次导致上述案例2(commonTestMockDAO都已运行)。

最后,我正在寻找的是一种能够为子类中的继承测试定义组的方法,但似乎TestDAO注释仅应用于测试方法在同一个类中,也不是没有@Test注释的继承方法。有没有其他方法可以实现这一点(不覆盖子类中的所有方法)?

4 个答案:

答案 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批注的解决方案。

示例:

  1. 我有一个基础测试班:

    public class TestBase {    
       @Test(priority = 0)
       public void testA()  {        
           assertTrue(true, "testA");
       }
    }
    
  2. 和另一个扩展的测试类:

    public class Test2 extends TestBase {
       @Test(priority = 1)
       public void testB() {        
           assertTrue(true, "testB");
       }
    

    }

  3. 运行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。两个测试都将被执行,但未初始化的测试将无效。

这很丑,我不推荐它(看起来更好的重新定义子方法并调用相应的超级方法),但在我的情况下,我需要优先考虑我的测试方法,我想避免重复在每个儿童班。