运行 针对大量网站的相同测试

Running same tests against a large number of websites

我需要 运行 对 70 多个功能相同但外观不同的网站进行相同的测试。但是,它们都是通过不同的 URL 访问的。

使用 TestNG 和 Java,将 URL 传递给测试的有效方法是什么,这样我就可以: a) 运行 针对每个站点的每个测试并报告相同的 b) 并行执行测试以节省时间(未来需要)

我想以一种格式存储 URL,以便最终用户可以看到并由他们配置。这最好是在 .csv 中,或者在 testng.xml 文件中。我在考虑 @DataProvider 或 @Factory,但我不确定如何以高效且可维护的方式使用它们从外部源获取参数,或者在我当前的模型中,这些方法最适合放在什么地方?我遇到的困难是我不想将数据必然传递到@Test 中,而是一次传递一个值(url)和运行 针对所有@Test 注释方法。

我目前的简单设置如下:

testngxml:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite1" verbose="1">
<test name="FindARouteTest">
    <parameter name="number" value="1"/>
    <parameter name="from" value="LONDON"/>
    <parameter name="to" value="GLASGOW"/>
    <parameter name="emailAddress" value="test@example.co.uk"/>
    <classes>
        <class name="acceptancetests.EndToEndTest">
        </class>
    </classes>
</test>

我的验收测试:

public class EndToEndTest extends DriverBase{

private HomePage home;
private String url;

@Factory(dataProvider = "urls", dataProviderClass = URLProvider.class)
public EndToEndTest(String url) {
    this.url = url;
}


@BeforeSuite
public void stuff(){
    newDriver();
}


@BeforeClass
public void setup(){
    home = new HomePage(driver, url);
}

@Test (priority = 1)
@Parameters({"from","to"})
public void searchForARoute(String from, String to) throws InterruptedException {
    home.selectWhereFrom(from);
    home.selectWhereTo(to);
    //some assertions...

我的页面对象:

public class HomePage extends SeleniumBase {

public HomePage(WebDriver driver, String url) {
    super(driver, url);
    try {
        visit(url);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    driver.manage().window().maximize();
}

public void someMethodOrOther(){
//some methods...

我的 Selenium 方法 BasePage:

public class SeleniumBase implements Config {

public WebDriver driver;
public String url;

public SeleniumBase(WebDriver driver) {
    this.driver = driver;
    this.url = url;
}

public void visit() throws MalformedURLException {
    driver.get(url);
} //more methods...

我的驱动程序基础页面:

public class DriverBase implements Config {

public static WebDriver driver;
public static String url;

    protected void newDriver() {
        if (host.equals("localhost")) {
            if (browser.equals("firefox")) {
                System.setProperty("webdriver.gecko.driver",
                        System.getProperty("user.dir") + "\drivers\geckodriver.exe");
                FirefoxProfile fp = new FirefoxProfile();
//more stuff

URL 提供商 class:

public class URLProvider {

@DataProvider(name = "urls")
public static Object[][] dataProviderMethod()
{
    return new Object[][] {{"http://siteone.com"},
                            {"http://sitetwo.com"},
                            {"http://sitethree.com"}
    };
}
}

最后,一个目前只有一个 BaseUrl 的配置:

public interface Config {

String baseUrl = System.getProperty("baseUrl", 
String browser = System.getProperty("browser", "chrome");
String host = System.getProperty("host", "localhost");

}

您可以在构造函数上使用 @Factory 注释进行测试 class EndToEndTest 并为其提供数据提供程序。

private String url;

@Factory(dataProvider = "urls", dataProviderClass = URLProvider.class)
public EndToEndTest(String url) {
  this.url = url;
}

您需要提供 URL 数据提供程序的实现 class 以访问 excel 或您想要的任何文件和 return 一个对象[][] .

需要修改 HomePage 和 SeleniumBase 的构造函数以传入您从 @BeforeClass 方法调用的 url。

这应该为每个 url 字符串为此测试 class 创建一个单独的实例并调用 @Test 方法。

如果您需要传入比字符串更多的数据URL,您可以使用对象。正如我所见,您在 testng.xml 中为方法传递了 4 个参数。

并行应该非常简单,我猜您可能希望在单个线程中 运行 给定 url 的所有 @Test 方法。并行选项为 "classes".