如何将testNG实例携带到另一个类

时间:2017-03-22 07:08:56

标签: java selenium servlets testng testng-dataprovider

正如IS:

第1步:我在servelt.doPost方法中创建了testng的实例。

public void  dummyDoPost(){


        TestListenerAdapter adapter = new TestListenerAdapter();

        testNG = new TestNG();
        List<Class> listnerClasses = new ArrayList<Class>();
        List<String> suiteNameList = new ArrayList<String>();
        Class[] classList = new Class[]{
                csvOperation.class
              };
        listnerClasses.add(straight2bank.csvOperation.class);
        testNG.setDefaultSuiteName("suite");
        testNG.setListenerClasses(listnerClasses);
        testNG.setTestClasses(classList);
        testNG.run();

第2步: 我创建了一个类,它将读取servelet返回的用户平台选择(Say ios,Android或Chrome)。

如下所示。  那另一个操作

Class B{
    public void platformController (Map<String,String> testDataValues){

        System.out.println("Platform Controller started.");
        String platformToBeExecuted = testDataValues.get("JourneyId");
        System.out.println("Journey ID returned to platformController " +platformToBeExecuted);

        if(platformToBeExecuted.contains("chrome")){
            System.out.println("Platform to be executed: Chrome");
            System.setProperty("webdriver.chrome.driver",pathToChromeDriver); 

            /****
            To remove message "You are using an unsupported command-line flag: --ignore-certificate-errors.
            Stability and security will suffer."
            Add an argument 'test-type'
            ChromeOptions options = new ChromeOptions();
            options.addArguments("test-type");
            *****/


            driver = new ChromeDriver();
            driver.get(urlOfApplication);
            System.out.println("3");

        }else if(platformToBeExecuted.contains("ie")){
            System.setProperty("webdriver.ie.driver", pathToIEDriver);
            driver = new InternetExplorerDriver();
            driver.get(urlOfApplication);
            System.out.println("2");

        }else if(platformToBeExecuted.contains("iOS")){
            System.out.println("Platform to be executed: iOS");
            System.out.println("Platform to be executed: iOS");
            suites.add(".//iostestng.xml");<-----------------
            dummyServletClass.testNG.setTestSuites(suites);
            dummyServletClass.testNG.run();


}

所以我在这里使用testng执行iosTestng.xml。

要做到这一点: -

1)我是否必须在testng课程中将servelt声明为静态并在此处使用相同的内容?
2)我是否需要在testng中为class B创建另一个实例?
3)有没有办法在setTestClasses中传递参数构造函数?

我很困惑,因为我们可能会长期并行运行程序。

1 个答案:

答案 0 :(得分:1)

如果每个POST调用基本上都代表了最终用户运行某些测试的意图,那么我建议你每次调用都要创建一个TestNG实例。这样,您就能够为每次调用隔离测试结果等

  

1)我是否必须在servelt类中将testng声明为static并在此处使用相同的内容?

不,不要那样做。你最终会导致竞争条件。您应该在POST方法实现中将TestNG对象声明为本地数据成员。如果你不希望你的POST调用是一个阻塞调用,你基本上可以让你的POST调用创建一个请求来运行一些测试到一个队列,你可以有一个轮询机制由一个单独的线程驱动,该线程从队列中提供并使用TestNG运行它们。

  

2)我是否需要在B类中为testng创建另一个实例?

是的,你需要。本质上,这里的想法是将TestNG实例本地化为它正在执行的测试集,这样就没有结果,监听器调用等的重叠。

  

3)有没有办法在setTestClasses中传递参数构造函数?

我不太明白这个问题。你这是什么意思?请详细说明。