【问题标题】:TestNG test inheritance and groupsTestNG 测试继承和组
【发布时间】:2011-10-10 03:25:22
【问题描述】:

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

  • 带有fastslow 组的@Test 注释将导致相反的效果——TestMockDAOTestDAO 都将运行,无论是只运行快速测试还是只运行慢速测试.

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

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

【问题讨论】:

    标签: java inheritance testng grouping


    【解决方案1】:

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

    让测试用例运行的一种方法是使用类似的东西:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我试过了,但它不起作用。继承的方法将位于默认组(或我在基类的@Test 注释中指定的任何组)中,而不是相应子类所在的组中。
      【解决方案3】:

      我使用的是 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
        

      【讨论】:

        【解决方案4】:

        我是这样解决的:

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

        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。两个测试都将被执行,但没有初始化的则什么都不做。

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

        【讨论】:

          猜你喜欢
          • 2011-05-29
          • 1970-01-01
          • 2010-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多