使用Maven在testNG中并行执行

时间:2018-01-04 11:00:10

标签: multithreading selenium parallel-processing multiprocessing testng

我的方案是在Parallel中启动多个chrome浏览器(最少2个)。

我为WebDriver初始化创建了一个单独的类,我也有2个xml文件,在该文件中每个都有2个测试。

WebDriver初始化

public class Stackoverflow extends LaunchBrowser
{
  @Test
  public void 1test() throws InterruptedException
  {
     initDriver();
     driver.get("https://stackoverflow.com");
     Thread.sleep(3000);
     System.out.println("Stack");
  } 

  @Test
  public void 2test() throws InterruptedException
  {
    Thread.sleep(3000);
  }
}

XML文件1:测试方法1

public class StackLogin extends LaunchBrowser
{
   @Test
   public void 1test() throws InterruptedException
   {   
     driver.findElement(By.xpath("//a[@href='https://stackoverflow.com/users/login?
ssrc=head&returnurl=https%3a%2f%2fstackoverflow.com%2f']")).click();
      Thread.sleep(3000);
   }

   @Test
   public void 2test() throws InterruptedException
   {
      Thread.sleep(3000);
   }

}

XML文件1:测试方法2

public class Google extends LaunchBrowser
{
  @Test
  public void 1test() throws InterruptedException 
  {
     initDriver();
     driver.get("https://www.google.co.in");
     Thread.sleep(3000);
     System.out.println("Google");
  }

  @Test
  public void 2test() throws InterruptedException
  {
   Thread.sleep(3000);
  }
}

XML文件2:测试方法1

public class Gmail extends LaunchBrowser
{
   @Test
   public void 1test() throws InterruptedException
   {
      driver.findElement(By.xpath("//a[@href='https://mail.google.com/mail/?tab=wm'][text()='Gmail']")).click();
      Thread.sleep(3000);
   }

   @Test
   public void 2test() throws InterruptedException
   {
     Thread.sleep(3000);
   }
}

XML文件2:测试方法2

<suite name="Suite1">
  <test name="01Stackoverflow">
    <classes>
        <class name="com.ci.selenium.Stackoverflow" />
    </classes>
  </test>

  <test name="02StackLogin">
    <classes>
        <class name="com.ci.selenium.StackLogin" />
    </classes>
  </test>
</suite>

testng1.xml

<suite name="Suite2">
  <test name="1Google">
     <classes>
        <class name="com.ci.selenium.Google"/>
    </classes>
  </test>

  <test name="2Gmail">
    <classes>
       <class name="com.ci.selenium.Gmail"/>
    </classes>
  </test>
</suite>

testng2.xml

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
          <version>2.19.1</version>
            <configuration>
               <suiteXmlFiles>${file}</suiteXmlFiles>
               <skipTests>false</skipTests>
                  <properties>
                    <property>
                        <name>suitethreadpoolsize</name>
                        <value>2</value>
                    </property>
                  </properties>
            </configuration>
</plugin>

此外,我在 pom.xml 文件

中进行了以下配置
mvn clean test -Dfile=MyWork/testng1.xml,MyWork/testng2.xml

最后,我使用以下maven命令触发了XML文件。

 java.lang.NullPointerException
at com.ci.selenium.StackLogin.1test(StackLogin.java:12)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
... Removed 18 stack frames

结果:

一次启动了两个Chrome浏览器,但每个xml文件中只有第一个测试方法通过,两个xml文件中的第二个测试都失败了。

请帮我解决这个问题。

日志

autoreconf

3 个答案:

答案 0 :(得分:1)

我使用以下网站在并行中推出了多个(至少2个)Chrome浏览器。

Thread Local for Parallel Test Execution

为了实现这种情况,我创建了3个类。一个用于WebDriver初始化,另一个用于Threads。

第1课

public class SetTestNG implements Runnable
{
  public String xmlString;

  public SetTestNG(String suitXMLUrl){
    xmlString = suitXMLUrl;
  }

  @Override
   public void run(){
     List<String> testSuites = Lists.newArrayList();
     testSuites.add(xmlString);
     TestNG testng = new TestNG();
     testng.setTestSuites(testSuites);
     testng.run();
   }
}

第2课:主要类

public class MultiThread
{
    private static String inputFiles;

   private static String[] xmlFile;

   public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, InterruptedException
   {

      inputFiles = args[0];
      xmlFile = inputFiles.split(",");

      for(String file : xmlFile)
      {
        Thread object1 = new Thread(new SetTestNG(System.getProperty("user.dir")+"/"+file));
        object1.start();
        Thread.sleep(5000);
      }
   }

}

注意:此代码的主要用例是为每个testNG Suite文件启动Chrome浏览器。

答案 1 :(得分:0)

您再次需要在类

的第二个Test方法中初始化驱动程序
 public class LaunchBrowser
 {
   public WebDriver driver =null;

   public WebDriver initDriver() {

    if (driver == null) {
        System.setProperty("webdriver.chrome.driver", "C:\\selenium\\drivers\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }
    return driver;
   }
}

XML文件1:测试方法2

public class StackLogin extends LaunchBrowser
{
   @Test
   public void 1test() throws InterruptedException
   {   
initDriver();
     driver.findElement(By.xpath("//a[@href='https://stackoverflow.com/users/login?
ssrc=head&returnurl=https%3a%2f%2fstackoverflow.com%2f']")).click();
      Thread.sleep(3000);
   }

   @Test
   public void 2test() throws InterruptedException
   {
      Thread.sleep(3000);
   }

}

XML文件2:测试方法2

public class Gmail extends LaunchBrowser
{


@Test
   public void 1test() throws InterruptedException
   {
    initDriver();
      driver.findElement(By.xpath("//a[@href='https://mail.google.com/mail/?tab=wm'][text()='Gmail']")).click();
      Thread.sleep(3000);
   }

   @Test
   public void 2test() throws InterruptedException
   {
     Thread.sleep(3000);
   }
}

答案 2 :(得分:0)

您希望每个<suite>代码只创建一次webdriver实例,然后在多个@Test代码中的<test>注释测试方法中共享。

为实现这一目标,您需要将LaunchBrowser课改为以下内容:

public class LaunchBrowser {
    protected WebDriver driver;

    @org.testng.annotations.BeforeSuite
    public void initDriver() {
        System.setProperty("webdriver.chrome.driver", "C:\\selenium\\drivers\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }
}

你还需要重构所有的测试,这样他们就不会明确地调用LaunchBrowser.initDriver(),否则会导致webdriver实例化发生两次 - 明确地通过你的调用发生,并且一次由TestNG隐式地发生使用@BeforeSuite注释进行注释的方法。

那应该解决你的用例。但请记住,这是管理webdriver实例的最有效方法,因为您现在严格限于顺序执行。您无法并行运行测试。