繁体   English   中英

TestNG测试继承和组

[英]TestNG test inheritance and groups

我们有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组运行。

  • 具有fastslow组的@Test注释将导致相反的效果 - 无论是仅运行快速测试还是仅进行慢速测试,都将运行TestMockDAOTestDAO

  • 具有不同组的@Test注释,比如common ,加上在TestMockDAOTestDAO添加的dependsOnGroups="common"注释也将不起作用,除非在要运行的组中包含common ,这又导致上面的案例2( TestMockDAOTestDAO正在运行)。

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

我目前正在处理类似的情况。

使测试用例运行的一种方法是使用以下内容:

@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中报告测试用例。

我正在使用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 

您是否尝试过在DAOTestBase上添加@Test注释? 每个子类都将使用自己的组覆盖它,这应该使基础中的方法成为测试方法。

我这样解决了:

基类中的方法是“基础”组,但需要检查测试是否已初始化。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM