首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TestNG使用DataProvider一次执行一次测试

TestNG使用DataProvider一次执行一次测试
EN

Stack Overflow用户
提问于 2018-01-23 10:26:24
回答 2查看 2K关注 0票数 0

我使用数据提供程序将数据传递给每个测试方法。让我们假设数据提供程序中有2行。

代码语言:javascript
复制
@Test(dataProvider = "TestData")
public void firstTest(String data){
   //Code
}

@Test(dataProvider = "TestData")
public void secondTest(String data){
   //Code
}

@Test(dataProvider = "TestData")
public void thirdTest(String data){
   //Code
}

当前,单个测试方法的所有迭代都运行,然后第二个测试方法运行.例如:

代码语言:javascript
复制
firstTest()
firstTest()

secondTest()
secondTest()

thirdTest()
thirdTest()

但我想按以下顺序运行。

代码语言:javascript
复制
firstTest()
secondTest()
thirdTest()

firstTest()
secondTest()
thirdTest()

下面是用于TestNG的xml。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="Test-Automation" parallel="methods" thread-count="2" verbose="1">
    <test name="Suite Test" parallel="methods" thread-count="2" verbose="1">
        <listeners>
             <listener class-name="GroupByInstanceEnabler"></listener>
        </listeners>

        <classes>
            <class name="SampleTest">
                <methods>
                    <include name="firstTest"/>
                    <include name="secondTest"/>
                    <include name="thirdTest"/>
                </methods>
            </class>
        </classes>
    </test>
</suite>

GroupByListener方法定义如下。

代码语言:javascript
复制
import org.testng.ISuite;
import org.testng.ISuiteListener;

public class GroupByInstanceEnabler implements ISuiteListener {

    @Override
    public void onStart(ISuite suite) {
        System.out.println("Hello");
        suite.getXmlSuite().setGroupByInstances(true);
    }

    @Override
    public void onFinish(ISuite suite) {

    }
}

我检查了下面的两个问题,这似乎对我不起作用。

TestNG迭代测试数据而不是测试方法。

TestNG -类级的数据提供程序测试烦恼

http://fruzenshtein.com/testng-dataprovider-run-tests-sequentially/

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-24 04:08:57

您应该使用由数据提供程序驱动的TestNG工厂。

下面是一个示例,向您展示了如何使用TestNG工厂和数据提供程序。

代码语言:javascript
复制
package com.rationaleemotions.stackoverflow.qn48399410;

import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;

public class SampleTestClass {
    private int iteration;

    @Factory(dataProvider = "dp")
    public SampleTestClass(int iteration) {
        this.iteration = iteration;
    }

    @Test
    public void firstTest() {
        System.err.println("firstTest() running for iteration #" + iteration);
    }

    @Test
    public void secondTest() {
        System.err.println("secondTest() running for iteration #" + iteration);
    }

    @Test
    public void thirdTest() {
        System.err.println("thirdTest() running for iteration #" + iteration);
    }

    @DataProvider(name = "dp")
    public static Object[][] getData() {
        return new Object[][]{
                {1},
                {2},
                {3}
        };
    }
}

这是套件xml文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="48399410_Suite" parallel="false" verbose="2">
    <test name="48399410_test" verbose="2" group-by-instances="true">
        <classes>
            <class name="com.rationaleemotions.stackoverflow.qn48399410.SampleTestClass"/>
        </classes>
    </test>
</suite>

只有在使用工厂时,属性group-by-instances=true才会产生效果。这将导致TestNG一起运行测试类实例中的所有方法(在本例中是合适的)。

有关更多信息,请参阅工厂上的官方TestNG文档

这是输出

代码语言:javascript
复制
...
... TestNG 6.13.1 by Cédric Beust (cedric@beust.com)
...
firstTest() running for iteration #2
secondTest() running for iteration #2

thirdTest() running for iteration #2
firstTest() running for iteration #3
secondTest() running for iteration #3
thirdTest() running for iteration #3
firstTest() running for iteration #1
secondTest() running for iteration #1
thirdTest() running for iteration #1
PASSED: firstTest
PASSED: secondTest
PASSED: thirdTest
PASSED: firstTest
PASSED: secondTest
PASSED: thirdTest
PASSED: firstTest
PASSED: secondTest
PASSED: thirdTest

===============================================
    48399410_test
    Tests run: 9, Failures: 0, Skips: 0
===============================================

===============================================
48399410_Suite
Total tests run: 9, Failures: 0, Skips: 0
===============================================
票数 1
EN

Stack Overflow用户

发布于 2018-03-07 17:28:07

代码语言:javascript
复制
Krishnan Mahadevan , how can i run the iteration for a data provider using an array inside test class.

for Example 
@Test (dataProvider="dp")
    public void firstTest() {
        System.err.println("firstTest() running for iteration #" + iteration);
        array of data provider elements ? 
    }
is it feasible via dataprovider ? 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48399410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档