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

Java 对大量网站运行相同的测试,java,selenium-webdriver,testng,testng-dataprovider,Java,Selenium Webdriver,Testng,Testng Dataprovider,我需要对70多个功能相同但外观不同的网站运行相同的测试。然而,它们都是通过不同的URL访问的 使用TestNG和Java,什么是将URL传递到测试的有效方法,以便我可以: a) 对每个站点运行每个测试,并在同一站点上报告 b) 并行执行测试以节省时间(未来需要) 我想以这样一种格式存储URL,即最终用户可以看到并可配置URL。这最好是在.csv或testng.xml文件中。我在考虑@DataProvider或@Factory,但我不确定如何以有效且可维护的方式使用它们从外部来源获取参数,或者在我

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

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

我想以这样一种格式存储URL,即最终用户可以看到并可配置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 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的配置:

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或任何您想要的文件并返回对象[]

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

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

如果需要传递的数据多于字符串URL,则可以使用对象。正如我看到的,您在testng.xml中为一个方法传递了4个参数


并行性应该非常简单,假设您希望在单个线程中运行给定url的所有@Test方法。并行选项将是“类”。

感谢您的详细回复-我将尝试您的建议,并让您知道我是如何得到它的。但是,通过在URLProvider.class中调试x3 URL,我可以看到,“@Factory”带注释的构造函数被调用了3次(每个参数调用一次)在“@BeforeClass”之前,这意味着3个线程?我相信,和3个浏览器窗口的测试并行运行。首先,我希望传递每个url,所有的“@Tests”都针对一个url运行,然后获取下一个url。因此,将一个URL传递给EndtoEnd构造函数,运行测试,然后获取下一个-不确定这是如何实现的。据我所知,您希望它连续运行,一个URL接一个URL。不是平行的。对吗?只需从testng.xml或测试中删除parallel选项,它就会一个接一个地运行。很抱歉,是的,开始时是串行的,但希望在将来研究并行。目前,我在testng.xml和测试中都没有并行代码。我将更新代码片段以显示当前实现,因此您希望在一个浏览器窗口中连续运行测试,而不是打开和关闭三个浏览器窗口。如果是这样,那么在EndToEndTest类中创建一个新方法并用“BeforeSuite”注释,并将newDriver()调用从当前的“BeforeClass”方法移动到此新方法。另外,请确保使用“AfterSuite”方法关闭或退出浏览器。从AfterClass方法中删除任何驱动器关闭。理论上,它应该只为整个测试套件打开一个浏览器窗口。
private String url;

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