Мне нужно запустить одни и те же тесты на более чем 70 веб-сайтах, которые функционально одинаковы, но имеют разные скины. Однако все они доступны через разные URL-адреса.
Используя TestNG и Java, что было бы эффективным способом передачи 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="[email protected]"/>
<classes>
<class name="acceptancetests.EndToEndTest">
</class>
</classes>
</test>
My acceptance 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:
public interface Config {
String baseUrl = System.getProperty("baseUrl",
String browser = System.getProperty("browser", "chrome");
String host = System.getProperty("host", "localhost");
}