TestNG使用Java对来自同一ArrayList的数据运行多个测试

TestNG使用Java对来自同一ArrayList的数据运行多个测试,java,collections,testng,Java,Collections,Testng,我刚开始使用TestNG,但在测试方面遇到了问题。在填充ArrayList之后,我尝试获取第一个元素,并在移除它之后(类似队列),但是所有测试看起来都是并行工作的,因为每个测试都获取相同的元素,我的意思是第二个测试在第一个测试从ArrayList移除元素之前开始工作 Lab1Main inst = new Lab1Main(); ArrayList<String> assets; /** * Method for reading inpu

我刚开始使用TestNG,但在测试方面遇到了问题。在填充ArrayList之后,我尝试获取第一个元素,并在移除它之后(类似队列),但是所有测试看起来都是并行工作的,因为每个测试都获取相同的元素,我的意思是第二个测试在第一个测试从ArrayList移除元素之前开始工作

    Lab1Main inst = new Lab1Main();
    ArrayList<String> assets;

    
    /**
     * Method for reading input from the console
     * reads only 2 times
     * @return ArrayList<String>
     */
    private ArrayList<String> input() {
        assets = new ArrayList<String>();
        Scanner scan = new Scanner(System.in);
        System.out.println("type your data and press enter at ther end");
        String line = scan.nextLine();
        assets.add(line);
        int count = 0;
        while (count < 1) {
            line = scan.nextLine();
            assets.add(line);
            count++;
        }
        scan.close();
        System.out.println("Scanner closed" + assets);
        return assets;
    }

    
    /**
     * Test will pass or fail depends on input data
     * if input String length less than 3(str.length<3) test will fail 
     * because mutator(setStr) in class Lab1Main will throws an error and won't initialize the variable 
     */
    @Test
    public void firstTest() {
        try {
            inst.setStr(assets.get(0));
        } catch (StringIndexOutOfBoundsException e) {
            System.out.println(e);
        } finally {
            Assert.assertEquals(inst.getStr(), assets.get(0));
            assets.remove(0);
        }
    }

    
    
    @Test
    public void secondtTest() {
        try {
            inst.setStr(assets.get(0));
        } catch (StringIndexOutOfBoundsException e) {
            System.out.println(e);
        } finally {
            Assert.assertEquals(inst.getStr(), assets.get(0));
            assets.remove(0);
        }
    }

    @BeforeTest
    public void beforeTest() {
        assets = input();
    }

    @AfterTest
    public void afterTest() {
    }

}
Lab1Main inst=新的Lab1Main();
ArrayList资产;
/**
*从控制台读取输入的方法
*只读了2次
*@returnarraylist
*/
专用ArrayList输入(){
资产=新的ArrayList();
扫描仪扫描=新扫描仪(System.in);
System.out.println(“键入数据并在另一端按enter键”);
String line=scan.nextLine();
资产。添加(行);
整数计数=0;
而(计数<1){
line=scan.nextLine();
资产。添加(行);
计数++;
}
scan.close();
系统输出打印项次(“扫描仪关闭”+资产);
归还资产;
}
/**
*测试是否通过取决于输入数据

*如果输入字符串长度小于3(str.length),我不能说它回答了我的问题,但这是解决这个问题的方法

    public Object[][] sendData() {
        return new Object[][] { { assets.get(0) }, { assets.get(1) } };
    }

    /**
     * Test will pass or fail depends on input data if input String length less than
     * 3(str.length<3) test will fail because mutator(setStr) in class Lab1Main will
     * throws an error and won't initialize the variable
     */
    @Test(dataProvider="sendData")
    public void firstTest(String data) {
        try {
            inst.setStr(data);
        } catch (StringIndexOutOfBoundsException e) {
            System.out.println(e);
        } finally {
            Assert.assertEquals(inst.getStr(), data);
        }
    }
public对象[][]sendData(){
返回新对象[][{{assets.get(0)},{assets.get(1)};
}
/**
*如果输入字符串长度小于,测试是否通过取决于输入数据
*3(str.length)
我的意思是,第二个测试在第一个测试从ArrayList中删除元素之前开始工作

TestNG中不保证测试的执行顺序。但是有一个名为
dependsOnMethods
的参数,您可以使用该参数对测试进行排序,如下所示:

    @Test
    public void firstTest() {
        //first testcase
    }    
    
    @Test(dependsOnMethods="firstTest")
    public void secondTest() {
        //second testcase
    }    
    
    @Test(dependsOnMethods="secondTest")
    public void thirdTest() {
        //third testcase
    }

有关更多详细信息,请参阅doc。(在链接中搜索单词
dependsOnMethods

这是否意味着测试是并行运行的?不。因为它们的顺序不正确并不意味着它们是并行运行的。类似TestNG的Junit使用以及反射返回的测试方法的顺序取决于JVM的心情。哇!明白了!谢谢!
    @Test
    public void firstTest() {
        //first testcase
    }    
    
    @Test(dependsOnMethods="firstTest")
    public void secondTest() {
        //second testcase
    }    
    
    @Test(dependsOnMethods="secondTest")
    public void thirdTest() {
        //third testcase
    }