Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TestNG迭代测试数据而不是测试方法_Java_Testng - Fatal编程技术网

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

Java TestNG迭代测试数据而不是测试方法,java,testng,Java,Testng,当将DataProvider与多个TestNG方法一起使用时,每个方法都会按顺序与所有数据集一起运行。相反,我希望迭代数据集,并在每次迭代中执行所有方法。 我不在乎结果是显示每个测试方法的结果,还是显示每个方法的运行摘要 我已经试过了 order-by-instances="true" 在suite.xml中没有成功 示例代码: public class TestNGTest { @DataProvider(name = "dp") public Object[][] crea

当将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")

找到了使用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);
        }
    }
}

请尝试使用以下侦听器组ByInstanceEnabler。您可以将这个监听器放在测试类(或测试基类,如果有的话)的Listeners注释中,或者更简单更好的解决方案是将它放在META-INF中,让TestNg使用ServiceLoader()加载它

这将允许您摆脱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

只是一个问题:为什么要这样做?在我的例子中,数据集表示需要设置和删除的状态。假设这是用户登录凭据,您希望测试每个用户的登录和注销。您现在可以使用单独的测试方法,而不是像logInAndOut这样的测试,所有测试方法都在一个用户帐户上运行。这可能只是我的问题,但我不喜欢失去测试的独立性。这些测试似乎只是测试步骤。我宁愿将每个步骤的细节放入helper方法中,然后让测试一步一步地调用它们。没错。这些都是步骤。在一个@Test中执行所有步骤的问题是,无论失败了什么,整个测试都会失败,您需要深入堆栈跟踪以获取错误的提示。虽然这对于白盒单元测试是可以的,但是对于黑盒测试,每个步骤有一个状态要详细得多。如果产品负责人在Jenkins/Bamboin中看到“测试X在步骤Y和测试数据Z中失败”,那么他可能比每次都“测试X失败”更好地理解这一点。虽然这并没有取代冗长的错误消息,但它确实为结果添加了详细信息。我还应该补充一点,我主要是在自动化测试,这些测试是为人类定义的,并且在没有自动化的情况下也是可执行的。因此,它们大多数由相互依赖的步骤组成。这与将“groupby instance=“true”添加到“”标记中完全相同。没错,效果是一样的。但是使用这种方法,您不需要suite.xml。在我问这个问题的时候,我也不知道工厂的情况。所以最好是使用套件xml,或者我测试了相同的代码,我得到了这个错误:-testngExamples.FooTest.testFactory必须返回[java.lang.Object[]或org.testng.IInstanceInfo[],但返回[LtestngExamples.FooTest$TestClass;很抱歉回复太晚。这确实是最好的答案。