testng - 如何分开测试和支持方法?

时间:2012-07-17 09:48:37

标签: java testng

我正在尝试使用testng。我的目标是在几个类中使用测试方法,并在一个单独的类中“支持”方法来准备和汇总一堆测试。

另一个要求是在测试套件中必须为多个测试部件调用支持方法。例如。第一部分包含testA和testB,第二部分包含testC和testD。这将导致以下步骤:

support1,testA,testB,support2,support1,testC,testD,support2

我的第一种方法(部分)是使用@Test注释所有方法,使用组并定义组之间的依赖关系,例如测试方法依赖于一组“setUp”,它是上例中一组支持方法“support1”。

这种方法的问题在于支持方法算作测试,因此生成的报告显示错误的“真实”测试数。

下一个想法是使用@BeforeGroups@AfterGroups,将支持方法放在一个组中,并使用组依赖关系。支持方法不应再算作测试。但我一开始就陷入困境。 例如,我试过

@BeforeGroups (groups = {"setUp"})

用于课程Support中的设置方法,以及

@Test(groups = { "TestA" }, dependsOnGroups = { "setUp" })

在“真正的”测试课程中。这导致以下(简单的)错误:

[testng] DependencyMap::Method "TestClass.testSomething()[...]" depends on nonexistent group "setUp"

为什么组“setUp”不存在?我忽视了什么吗?

还是有另一种方法可行吗?

感谢您的帮助!

修改 测试是从Ant开始的,我使用像这样的testng.xml:

<test name="TestA">
    <groups>
        <run>
            <include name="setUp" />
            <include name="TestA"/>
            <include name="tearDown"/>
        </run>
    </groups>
    <classes>
        <class name="seleniumtest.test.technical.Support"/>
        <class name="seleniumtest.test.business.TestClassA"/>
    </classes>
</test>
<test name="TestB">
    <groups>
        <run>
            <include name="setUp" />
            <include name="TestB"/>
            <include name="tearDown"/>
        </run>
    </groups>
    <classes>
        <class name="seleniumtest.test.technical.Support"/>
        <class name="seleniumtest.test.business.TestClassB"/>
    </classes>
</test>

3 个答案:

答案 0 :(得分:4)

我得到了故障!!

问题在于注释

@Test(groups = { "TestA" }, dependsOnGroups = { "setUp" })

基本上你的错误信息是试图说没有@Test方法,groupname为setUp !!提出您的问题,解决方案是修改测试方法的注释,如下所示

 @Test(groups = { "TestA" })

并在支持方法中修改注释

  @BeforeGroups (groups = {"TestA"})

我使用此设置运行了一个示例示例

public class TestSupport {

    @BeforeGroups(groups = { "sample","sample1" })
    public void beforeTest() {
        System.out.println("Before test");
    }

    @AfterGroups(groups = { "sample","sample1" })
    public void afterTest() {
        System.out.println("after test");
    }

}

以我的Test类为

public class TestClassA {

    @Test(groups = { "sample" })
    public void superTestA() {
        System.out.println("This is the actual test");
    }

    @Test(groups = { "sample" })
    public void superTestB() {
        System.out.println("This is the another test under sample group");
    }

    @Test(groups = { "sample1" })
    public void superTest() {
        System.out.println("This is another test");
    }
}

和我的testng.xml如下所示

<test name="sampletest" >
     <groups>
        <run>
            <include name="sample" />
            <include name="sample1" />

        </run>
    </groups>
    <classes>
        <class name="test.global.testng.TestClassA"/>
        <class name="test.global.testng.TestSupport"/>
    </classes>

  </test>

现在,这就是测试的运行方式:beforeGroups-> superTestA/superTestB ->afterGroupsbeforeGroups-> superTest -> afterGroups并关闭

答案 1 :(得分:2)

我想我已经提出了我想要的解决方案。

我需要使用的是支持类中@BeforeTest@AfterTest而不是@BeforeGroups@AfterGroups

@BeforeTest(groups = {"setUp"})
public void beforeTest() {[...]}

@AfterTest( groups = {"tearDown"})
public void afterTest() {[...]}

在测试课程中:

@Test(groups = { "TestA" })
public void testSomething() {[...]}

dependsOnGroups已经消失,就像巴顿的方法一样。

与我的问题相比,testng.xml没有变化。即可以在testng.xml文件中配置测试,而无需更改java代码。

此外,这个解决方案也摆脱了BeforeGroups方法的另一个问题,至少就像Patton所假设的那样(@Patton我不是故意冒犯你)。 对于后者,使用多个测试组的测试未按预期运行,因为beforeTest()方法将在任何组之前运行。例如。如果你有以下测试(testng.xml的摘录):

    <groups>
        <run>
            <include name="TestA"/>
            <include name="TestB"/>
        </run>
    </groups>

......执行的执行步骤是:
beforeTest(),TestA,beforeTest(),TestB,afterTest()。

使用BeforeTest的解决方案,您将进行以下测试:

    <groups>
        <run>
            <include name="setUp" />
            <include name="TestA"/>
            <include name="TestB"/>
            <include name="tearDown"/>
        </run>
    </groups>

......执行的执行步骤是:
setUp = beforeTest(),TestA,TestB,tearDown = afterTest()。

答案 2 :(得分:0)

package com.test.MySample;

import org.testng.annotations.*; 

public class TestNGTest1 {    

    @BeforeTest   
    public void BeforeTest() {         
        System.out.println("@BeforeTest");
    }

    @BeforeClass    
    public void BeforeClass() {         
        System.out.println("@BeforeClass");
    }      

    @BeforeGroups  (groups = {"My group"}) 
    public void BeforeGroups() {       
        System.out.println("@BeforeGroups");
    }

    @BeforeGroups  (groups = {"My group1"}) 
    public void BeforeGroups1() {       
        System.out.println("@BeforeGroups1");
    }

    @AfterGroups  (groups = {"My group1"}) 
    public void AfterGroups1() {       
        System.out.println("@AfterGroups1");
    }

    @BeforeMethod    
    public void BeforeMethod() {         
        System.out.println("@BeforeMethod");     
    } 

    @Test(groups = {"My group"})     
    public void test1() {         
        System.out.println("test1");     
    } 

    @Test (groups = {"My group", "My group1"})    
    public void test2() {         
        System.out.println("test2");     
    }

    @AfterMethod    
    public void AfterMethod() {         
        System.out.println("@AfterMethod");     
    } 

    @AfterGroups  (groups = {"My group"}) 
    public void AfterGroups() {       
        System.out.println("@AfterGroups");
    }

    @AfterClass    
    public void AfterClass() {         
        System.out.println("@AfterClass");
    }  

    @AfterTest   
    public void AfterTest() {         
        System.out.println("@AfterTest");
    }
}