当前位置: 首页 > 知识库问答 >
问题:

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

曹茂材
2023-03-14

我正在试验测试。我的目标是在几个类中拥有测试方法,并在一个单独的类中为准备和总结一堆测试提供“支持”方法。

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

支持,测试,测试,支持,支持

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

这种方法的问题是,支持的方法计为测试,因此生成的报告显示了错误的“真实”测试数。

下一个想法是使用@BeforeGroups@AfterGroups,将支持的方法放在一个组中,并使用组依赖项。支持方法不应再被视为测试。但我在一开始就被困住了。比如我试过

@BeforeGroups (groups = {"setUp"})

对于类支持中的设置方法,以及

@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个答案

徐隐水
2023-03-14
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");
    }
} 
邵骏喆
2023-03-14

我想我已经想出了我想要的解决办法。

我需要在支持类中分别使用@BeforeTest@AfterTest而不是@BeforeGroup@AfterGroup

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

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

在测试类中:

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

与巴顿的方法一样,依赖组已经消失。

测试正在进行。与我的问题相比,xml没有改变。也就是说,可以在testng中配置测试。xml文件,无需更改java代码。

此外,这个解决方案还解决了BeforeGroup方法的另一个问题,至少巴顿认为是这样(@巴顿,我无意冒犯你)。对于后者,使用几个测试组的测试不能按预期运行,因为beForeTest()方法将在任何组之前运行。例如,如果你有以下测试(testng.xml摘录):

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

...执行的结果步骤是:
beForeTest(),TestA,beForeTest(),TestB,postTest()。

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

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

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

何涵育
2023-03-14

我有故障!!

问题出在注释上

@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");
    }

}

我的测试课是

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");
    }
}

还有我的测试。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-

 类似资料:
  • 主要内容:1. 在方法上的分组,2. 在类上的分组,3. 其它分组分组测试是TestNG中的一个新的创新功能,它在JUnit框架中是不存在的。 它允许您将方法调度到适当的部分,并执行复杂的测试方法分组。 您不仅可以声明属于某个分组的方法,还可以指定包含其他组的组。 然后调用,并要求其包含一组特定的组(或正则表达式),同时排除另一个分组。 组测试提供了如何分区测试的最大灵活性,如果您想要背靠背运行两组不同的测试,则不需要重新编译任何内容。 使用标记在文件中指定分组

  • 这是驱动程序类,它将为每个测试方法创建驱动程序实例。

  • 你可以为特定 variant 运行 lint,例如 ./gradlew lintRelease,或为所有 variants 运行(./gradlew lint),这种情况下会生成一份包含特定版本存在的问题的详细报告。你可以像下面的代码片段那样通过配置 lintOptions 节点来配置 lint。一般只能配置小部分选项,查看 DSL reference 了解所有可修改的选项。 android {

  • 5.5 Lint支持 从0.7.0版本之后,你可以为一个特定的变种版本运行 lint ,也可以为所有变种版本都运行.在这种情况下,它会产生一个报告指出给定的变种版本的问题. 你可以像下面一样通过 lintOptions 自定义 lint .一般情况下,你只需要配置其中的一部分.以下是展示所有可用的 lint 配置项. android { lintOptions { // s

  • 12.10 测试 因为所有基于JSR-352的作业都是异步执行的,所以很难确定一项作业什么时候完成。为了辅助测试,Spring Batch提供了 org.springframework.batch.core.jsr.JsrTestUtils。这个工具类可以启动一个job,或者重新启动一个job,以及等待作业完成。当作业完成后, 就返回相关联的JobExecution。

  • 11.3 JDBC测试支持 org.springframework.test.jdbc是包含JdbcTestUtils的包,它是一个JDBC相关的工具方法集,意在简化标准数据库测试场景。特别地,JdbcTestUtils提供以下静态工具方法: countRowsInTable(..):统计给定表的行数。 countRowsInTableWhere(..):使用提供的where语句进行筛选统计给定表