【问题标题】:Run parallel test methods which are dependent with different parameter using Data Provider in TestNg使用 TestNg 中的数据提供程序运行依赖于不同参数的并行测试方法
【发布时间】:2021-03-21 09:42:41
【问题描述】:

我想运行依赖并使用 ITestContext 的测试方法,以使用 TestNg 中的数据提供程序与不同的参数并行运行。我正在尝试务实地调用测试类。

代码如下所示:

package com.ExploringTestNg;

import java.util.Random;

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

public class ParallelMethodTest {
    
    @Test(dataProvider = "dataprovider")
    public void testclass1(ITestContext context,String deviceId) {
        
        long id = Thread.currentThread().getId();
        System.out.println("TestClass1 is being called and context is being setup");
        System.out.print("The thread id is "+id);
        System.out.println("device id is "+deviceId);
        context.setAttribute("deviceId",deviceId);
    }
    @Test(dependsOnMethods = {"testclass1"})
    public void testclass2(ITestContext context) {
        long id = Thread.currentThread().getId();
        System.out.println("TestClass2 is being called and context is being retrieved "+(String)context.getAttribute("deviceId"));
        System.out.println("The thread id is "+id+"\n");
    }
    @Test(dependsOnMethods = {"testclass2"})
    public void testclass3(ITestContext context) {
        long id = Thread.currentThread().getId();
        System.out.println("TestClass3 is being called and context is being retrieved "+(String)context.getAttribute("deviceId"));
        System.out.println("The thread id is "+id);
    }
    @DataProvider(name = "dataprovider",parallel = true)
    public Object[][] getDataFromDataprovider(){
        return new Object[][]
                {
                    {"1001"},
                    {"1002"},
                    {"1003"}
                };
    }
}
package com.ExploringTestNg;

import java.util.ArrayList;
import java.util.List;

import org.testng.TestNG;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;

public class DynamicXMLSetuo  {

    public static void main(String[] args) {
        XmlSuite suite = new XmlSuite();
        suite.setName("TempSuite1");
        XmlTest test = new XmlTest(suite);
        test.setName("Functional usecase 1");
        List<XmlClass> classes = new ArrayList<XmlClass>();
        classes.add(new XmlClass("com.ExploringTestNg.ParallelMethodTest"));
        test.setXmlClasses(classes);
        
        List<XmlSuite> suites = new ArrayList<XmlSuite>();
        suites.add(suite);
        TestNG tng = new TestNG();
        tng.setXmlSuites(suites);
        tng.setThreadCount(5);
        tng.setParallel(XmlSuite.ParallelMode.METHODS);
        tng.run();
    }

}

我的功能是使用不同的参数多次调用测试类,并且被调用的类应该并行运行

【问题讨论】:

  • 请提及您面临的问题
  • 方法 testclass1 被调用了 3 次,但我希望调用整个序列,而不仅仅是一个方法。

标签: java testng


【解决方案1】:

问题在于 testclass1 会被调用 3 次,但 testclass2testclass3 只会被调用一次,因为这些方法的执行不取决于 @987654324 的次数@ 被执行。它只取决于testclass1 是否通过。要解决这个问题,你需要使用@Factory

public class ParallelMethodTest {

    private final String deviceId;

    ParallelMethodTest(String id) {
        this.deviceId = id;
    }

    @DataProvider(parallel = true)
    public static Object[][] dataProvider() {
        return new Object[][] { { "1001" }, { "1002" }, { "1003" } };
    }

    @Factory(dataProvider = "dataProvider")
    public Object[] createInstances(String id) {
        // The factory method uses the dataProvider to initialize
        // multiple instances of the test class.
        return new Object[] { new ParallelMethodTest(id) };
    }

    @Test
    public void testclass1() {

        long id = Thread.currentThread().getId();
        System.out.println("TestClass1 is being called and context is being setup");
        System.out.print("The thread id is " + id);
        System.out.println("device id is " + deviceId);
    }

    @Test(dependsOnMethods = { "testclass1" })
    public void testclass2() {
        long id = Thread.currentThread().getId();
        System.out.println("TestClass2 is being called and context is being retrieved " + deviceId);
        System.out.println("The thread id is " + id + "\n");
    }

    @Test(dependsOnMethods = { "testclass2" })
    public void testclass3() {
        long id = Thread.currentThread().getId();
        System.out.println("TestClass3 is being called and context is being retrieved " + deviceId);
        System.out.println("The thread id is " + id);
    }
}

这样,就无需在测试上下文中存储deviceId,因为相应的deviceId 将在类本身中可用。

更新:要并行运行,您需要在 DynamicXMLSetuo 中再做一件事。

suite.setParallel(XmlSuite.ParallelMode.METHODS);

通过添加ParallelMode.METHODS,TestNG 将在单独的线程中运行您的所有测试方法。依赖方法也将在单独的线程中运行,但它们将遵循您指定的顺序。

【讨论】:

  • 所以我在这里概括的功能是使用不同的设备 id 进行 API 调用,我在响应中得到的 id 将作为键值通过 ITestContext 传递。我必须多次调用 API 来测试负载/性能。使其成为一系列 API 调用以测试整个过程。
  • @Aditya,在这种情况下,您可以在类中添加responseDeviceId 字段,然后从响应中将值设置为此。
  • 当我们想要并行运行测试用例时会不会产生问题?
  • @Aditya 我已经更新了答案。要并行运行测试,您需要拥有suite.setParallel(XmlSuite.ParallelMode.METHODS);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多