Java 按顺序为DataProvider中的每个数据集运行一组测试

Java 按顺序为DataProvider中的每个数据集运行一组测试,java,testng,Java,Testng,我需要在数据提供程序中的每个数据之前运行一些测试 例如,在下面的示例类中,我需要运行someStartTest 4次(在每个数据之前),如何做到这一点 public class Poligon { @Test() public void someStart(){ System.out.println("Start"); } @DataProvider public Object[][] getData() { retur

我需要在
数据提供程序
中的每个数据之前运行一些测试
例如,在下面的示例类中,我需要运行
someStart
Test 4次(在每个数据之前),如何做到这一点

public class Poligon {

    @Test()
    public void someStart(){
        System.out.println("Start");
    }

    @DataProvider
    public Object[][] getData() {
        return new Object[][]{{"a",1},{"c",2},{"d",4},{"x",0}};
    }

    @Parameters({"p","n"})
    @Test(dataProvider = "getData", dependsOnMethods = "someStart")
    public void x(String p, int n){
        String[] a = {"a","b","c","d"};
        int i = 0;
        while( i < a.length && !a[i].equals(p)) i++;
        i = (i < a.length)? i + 1 : 0;
        System.out.println(p + ": " + i);
        Assert.assertEquals(i, n);
    }

    @Test(dependsOnMethods = "x", alwaysRun = true)
    public void someEnd(){
        System.out.println("End");
    }

}

我在这个网站上找到了答案:和。但这不是我真正需要的。 我无法使用不同的
工厂运行多组测试,如果没有它,则无法按预期顺序运行

第一:添加了带有
工厂的类

2en:在测试类中添加了局部变量和构造函数

工厂等级:

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

@Test()
public class Poligon2 {

    @Factory(dataProvider = "class-data-provider")
    public Object[] getTestClasses(String s, int n) {
        Object[] tests = new Object[1];
        tests[0] = new Poligon(s, n);
        return tests;
    }

    @DataProvider(name = "class-data-provider")
    public Object[][] getData() {
        return new Object[][]{{"a", 1}, {"c", 3}, {"d", 4}, {"x", 0}};
    }
}
测试类别:

import org.testng.Assert;
import org.testng.annotations.*;

public class Poligon {
    final String p;
    final int n;
    int run = 0;
    static int instance = 0;
    final int current_instance;
    static int globalrun = 0;

    public Poligon(String p, int n){
        this.p = p;
        this.n = n;
        instance++;
        current_instance = instance;
    }

    @Test()
    public void someStart(){
        System.out.println("Start");
        System.out.println(String.format("Instance: %d; Instance run: %d; Global run %d.", current_instance, run++, globalrun++));
    }

    @Test(dependsOnMethods = "someStart")
    public void x(){
        String[] a = {"a","b","c","d"};
        int i = 0;
        while( i < a.length && !a[i].equals(p)) i++;
        i = (i < a.length)? i + 1 : 0;
        System.out.println(p + ": " + i);
        System.out.println(String.format("Instance: %d; Instance run: %d; Global run %d.", current_instance, run++, globalrun++));
        Assert.assertEquals(i, n);
    }

    @Test(dependsOnMethods = "x", alwaysRun = true)
    public void someEnd(){
        System.out.println("End");
        System.out.println(String.format("Instance: %d; Instance run: %d; Global run %d.", current_instance, run++, globalrun++));
    }
}

我在这个网站上找到了答案:和。但这不是我真正需要的。 我无法使用不同的
工厂运行多组测试,如果没有它,则无法按预期顺序运行

第一:添加了带有
工厂的类

2en:在测试类中添加了局部变量和构造函数

工厂等级:

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

@Test()
public class Poligon2 {

    @Factory(dataProvider = "class-data-provider")
    public Object[] getTestClasses(String s, int n) {
        Object[] tests = new Object[1];
        tests[0] = new Poligon(s, n);
        return tests;
    }

    @DataProvider(name = "class-data-provider")
    public Object[][] getData() {
        return new Object[][]{{"a", 1}, {"c", 3}, {"d", 4}, {"x", 0}};
    }
}
测试类别:

import org.testng.Assert;
import org.testng.annotations.*;

public class Poligon {
    final String p;
    final int n;
    int run = 0;
    static int instance = 0;
    final int current_instance;
    static int globalrun = 0;

    public Poligon(String p, int n){
        this.p = p;
        this.n = n;
        instance++;
        current_instance = instance;
    }

    @Test()
    public void someStart(){
        System.out.println("Start");
        System.out.println(String.format("Instance: %d; Instance run: %d; Global run %d.", current_instance, run++, globalrun++));
    }

    @Test(dependsOnMethods = "someStart")
    public void x(){
        String[] a = {"a","b","c","d"};
        int i = 0;
        while( i < a.length && !a[i].equals(p)) i++;
        i = (i < a.length)? i + 1 : 0;
        System.out.println(p + ": " + i);
        System.out.println(String.format("Instance: %d; Instance run: %d; Global run %d.", current_instance, run++, globalrun++));
        Assert.assertEquals(i, n);
    }

    @Test(dependsOnMethods = "x", alwaysRun = true)
    public void someEnd(){
        System.out.println("End");
        System.out.println(String.format("Instance: %d; Instance run: %d; Global run %d.", current_instance, run++, globalrun++));
    }
}

如果您需要调用someStart()的内容,请将其放入“for”循环中。我不知道你为什么需要调用test 4次?如果这只是为了让其他考试通过,我认为这是糟糕的笔试。测试不应该相互依赖。这只是一个例子,我需要在使用数据提供程序进行测试之前运行一些测试…所以就像我之前所说的,测试不应该相互依赖。我知道我可以将
someStart
x
连接起来,问题是我需要拆分
x
进行最简单(更详细)的测试。有可能吗?我认为您可以循环使用从getData返回的对象[],并在someStart测试中测试它。我的意思是,如果需要调用someStart()调用的内容,调用对象[]的每个元素所需的任何测试4次,将其放入“for”循环中。我不知道你为什么需要调用test 4次?如果这只是为了让其他考试通过,我认为这是糟糕的笔试。测试不应该相互依赖。这只是一个例子,我需要在使用数据提供程序进行测试之前运行一些测试…所以就像我之前所说的,测试不应该相互依赖。我知道我可以将
someStart
x
连接起来,问题是我需要拆分
x
进行最简单(更详细)的测试。有可能吗?我认为您可以循环使用从getData返回的对象[],并在someStart测试中测试它。我的意思是,无论你对对象[]的每个元素做什么测试,你都应该接受你的答案,这样问题就结束了。当我现在尝试这样做时,我得到的信息是:你明天可以接受你自己的答案,你应该接受你的答案,这样问题就结束了。当我现在尝试这样做时,我得到的信息是:你明天可以接受你自己的答案