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

时间:2014-11-06 15:50:02

标签: java testng

将DataProvider与多个TestNG方法一起使用时,每个方法都按顺序运行所有数据集。相反,我想迭代数据集并在每次迭代时执行所有方法。 我不在乎结果是显示每个测试方法的结果还是每个方法的运行总结。

我已经尝试了选项

order-by-instances="true"

在suite.xml中没有成功。

示例代码:

public class TestNGTest
{
    @DataProvider(name = "dp")
    public Object[][] createData(Method m) {
      return new Object[][] { new Object[] { "Cedric" }, new Object[] {"Martina"}};
    }

    @Test(dataProvider = "dp")    
    public void test1(String s) throws InterruptedException {
        System.out.println("test1 " + s);
        Thread.sleep(1000);
    }

    @Test(dataProvider = "dp")
    public void test2(String s) throws InterruptedException {
        System.out.println("test2 " + s);
        Thread.sleep(1000);
    }
}

实际结果:

test1 Cedric
test1 Martina
test2 Cedric
test2 Martina
PASSED: test1("Cedric")
PASSED: test1("Martina")
PASSED: test2("Cedric")
PASSED: test2("Martina")

通缉结果:

test1 Cedric
test2 Cedric
test1 Martina
test2 Martina
PASSED: test1("Cedric")
PASSED: test2("Cedric")
PASSED: test1("Martina")
PASSED: test2("Martina")

2 个答案:

答案 0 :(得分:1)

请尝试使用以下侦听器GroupByInstanceEnabler。你可以把这个监听器放在你的测试类中的监听器注释中(或者如果有的话,可以放在测试基类中),或者更简单和更好的解决方案就是将它放在META-INF中让TestNg使用ServiceLoader加载它(http://testng.org/doc/documentation-main.html#listeners-service-loader

这将允许您摆脱suite.xml,并且只允许您在类路径上保留此META-INF和启用程序所需的内容。任何时候你都会运行任何测试,这将被加载 - 不需要配置任何像IDE,创建套件来运行 - 它总是会加载你的听众开箱即用。

import org.testng.ISuite;
import org.testng.ISuiteListener;

public class GroupByInstanceEnabler implements ISuiteListener {

    @Override
    public void onStart(ISuite suite) {
        suite.getXmlSuite().setGroupByInstances(true);
    }

    @Override
    public void onFinish(ISuite suite) {

    }
}

的Pawel

答案 1 :(得分:0)

使用Factory,DataProvider和注入的XmlTest对象找到解决方案。

当然,TestClass可以在另一个文件中。我更喜欢将它作为一个内部阶级,因为它无法在没有工厂的情况下运行。这个解决方案的唯一缺点是你不能从课堂上进行单一测试。

package com.nhp.ts.test.business.qi;

import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
import org.testng.xml.XmlTest;

public class FooTest {

    @DataProvider(name = "dp")
    public Object[][] createData() {
        return new Object[][] {
            { "Cedric" },
            { "Martina" }
        };
    }

    @Factory(dataProvider = "dp")
    public TestClass[] testFactory(String name) {
        return new TestClass[] { new TestClass(name) };
    }

    public class TestClass {

        private String name;

        public TestClass(String name) {
            this.name = name;
        }

        @BeforeTest
        public void setOptions(XmlTest test)
        {
            test.setGroupByInstances(true);
        }

        @Test
        public void test1() throws InterruptedException {
            System.out.println("test1 " + name);
        }

        @Test
        public void test2() throws InterruptedException {
            System.out.println("test2 " + name);
        }
    }
}