运行 针对大量网站的相同测试
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".
我需要 运行 对 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".