当前位置: 首页 > 知识库问答 >
问题:

使用数据提供程序进行并行测试

子车安和
2023-03-14

我想用Selenium和TestNG来模拟谷歌搜索,同时使用各种搜索参数。下面是我的测试类和testng。xml。我已经使用下面的注释@test(dataProvider=“googlesearchDataProvider”、threadPoolSize=3、singleThreaded=false)或testng测试了我的测试分类。xml。这两个案例测试都在单浏览器单线程中运行。你能告诉我出了什么问题,需要做什么吗。我想一次会有3个独立的浏览器实例并行运行,不同的搜索数据从数据提供商那里获取。

package com.test.google.search;

import static org.testng.Assert.fail;

import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import com.aig.testframework.Driver;

/**
 * @author dpoddar
 *
 */
public class GoogleSearch {

    private WebDriver driver;
    private String baseUrl;
    private boolean acceptNextAlert = true;
    private StringBuffer verificationErrors = new StringBuffer();

    //@BeforeClass(alwaysRun = true)
    @BeforeTest(alwaysRun = true)
    public void setUp() throws Exception {
        Driver.getInstance().setDriver("firefox", "Windows 7", "local");
        driver =  Driver.getInstance().getDriver(); 

        baseUrl = "https://www.google.com/";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    @Test(dataProvider="googlesearchDataProvider",threadPoolSize=3,singleThreaded=false)
    public void testGoogleSearch(String serachParam) throws Exception {
        System.out.println("testGoogleSearch. Thread id is: " + Thread.currentThread().getId());
        driver.get("https://www.google.com/");
        driver.findElement(By.name("q")).clear();
        driver.findElement(By.name("q")).sendKeys(serachParam);
        driver.findElement(By.name("q")).sendKeys(Keys.ENTER);
    }

    //@AfterClass(alwaysRun = true)
    @AfterTest(alwaysRun=true)
    public void tearDown() throws Exception {
        driver.quit();
        String verificationErrorString = verificationErrors.toString();
        if (!"".equals(verificationErrorString)) {
            fail(verificationErrorString);
        }
    }


    @DataProvider(name = "googlesearchDataProvider")
    public Object[][] createData(Method m) {
      System.out.println(m.getName());  // print test method name
      return new Object[][] { new Object[] { "Test"},{"google"},{"Java"},{"Spring"},{"AWS"},{"Market Trends"},{"Hotels Near 91367"},{"Starbucks"}};
    }
}

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Parallel test suite" parallel="instances" thread-count="3">
  <test name="Regression 1" >
    <classes>
      <class name="com.test.google.search.GoogleSearch"/>
    </classes>
  </test>
</suite>

共有1个答案

丌官远
2023-03-14

我使用@Factory和testng中的更改解决了这个问题。xml。变化如下。

请使用问题陈述中的其他方法。

public class GoogleSearch {
 private String searchParam;
 @Factory(dataProvider = "googlesearchDataProvider",enabled=true)
 public GoogleSearch(String searchParam) {
      this.searchParam = searchParam;
  }

 @Test
 public void testGoogleSearch() throws Exception {
        System.out.println("testGoogleSearch with "+searchParam+". Thread id is: " + Thread.currentThread().getId());
        driver.get("https://www.google.com/");
        driver.findElement(By.name("q")).clear();
        driver.findElement(By.name("q")).sendKeys(searchParam);
        driver.findElement(By.name("q")).sendKeys(Keys.ENTER);
    }
}

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Parallel test suite" verbose="2">
  <test name="Regression 1" parallel="instances" thread-count="3">
    <classes>
      <class name="com.test.google.search.GoogleSearch"/>
    </classes>
  </test>
</suite>
 类似资料:
  • 我想在类中与数据提供者并行运行测试方法。我需要一个数据提供者,它每次在新测试方法开始为给定的测试运行生成部分动态数据之前都会被调用。让我用伪代码解释一下: 我怎样才能做到这一点?

  • 我想在TestNg中并行运行硒测试,使用“数据提供者”。理想情况下,测试是按方法并行的(一个测试=一个方法),而不是简单的浏览器套件并行。我在某个地方读到过,一次可以控制大约5个ChromeDriver实例,所以我认为这应该是可能的。稍后,我计划转移到grid2。对于开发,我将通过右键单击XML配置文件上的运行来运行IntelliJ idea测试运行程序。 我在并行运行测试时遇到了问题(在grid

  • suite name=“knowledgetest”verbose=“5”configfailurepolicy=“continue”data-provider-thread-count=“10”parallel=“methods”thread-count=“5”

  • 我正在尝试使用selenium grid和TestNG对chrome和Firefox进行并行测试。 我正在使用@DataProvider使其使用单个excel文件进行数据驱动 但是,每次我尝试运行套件时,其中一个浏览器都会关闭,并在其中一个浏览器仍能正常运行测试脚本时抛出以下错误堆栈: 我有以下项目在testng.xml 对于before测试,我有以下内容,它位于名为Framework的类中,由名

  • 我正在尝试通过TestNG进行多线程测试为测试实例化WebDrivers<代码>@AfterMethod在测试后关闭WebDrivers

  • 问题内容: 我目前正在做我的第一个Java项目,并且希望完全TDD。我正在使用JUnit编写测试。显然,JUnit不提供对数据提供程序的支持,这使得使用20个不同版本的参数测试同一方法变得很烦人。支持数据提供者的Java最受欢迎/最标准的测试工具是什么?我遇到过TestNG,但不知道它有多受欢迎,或与替代品相比如何。 如果有一种方法可以使这种行为成为使用JUnit的好方法,那么这也可能会起作用。