对大量网站运行相同的测试[英] 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 方法基页:

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 提供者类:

public class URLProvider {

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

最后,一个当前只包含一个 BaseUrl 的 Config:

public interface Config {

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

}

推荐答案

您可以在测试类 EndToEndTest 的构造函数上使用 @Factory 注解,并给它一个数据提供者.

private String url;

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

您需要提供 URL 数据提供程序类的实现来访问 excel 或您想要的任何文件并返回 Object[][].

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

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

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

并行性应该很简单,猜想你会想在单个线程中运行给定 url 的所有 @Test 方法.并行选项是"类".

本文地址:https://www.itbaoku.cn/post/978417.html