Gleiche Tests für eine große Anzahl von Websites ausführen

Ich muss dieselben Tests für über 70 Websites ausführen, die alle dieselbe Funktion haben, aber unterschiedliche Skins haben. Sie werden jedoch alle über unterschiedliche URLs aufgerufen.

Verwenden Sie TestNG und Java, um die URLs effizient an die Tests zu übergeben. So können Sie: a) jeden Test für jede Site ausführen und denselben Bericht erstellen. B) Tests parallel ausführen, um Zeit zu sparen (zukünftiger Bedarf).

Ich möchte die URLs in einem Format speichern, das Endbenutzern zugänglich und von ihnen konfigurierbar ist. Dies wäre idealerweise in einer CSV-Datei oder alternativ in der Datei testng.xml. Ich denke an @DataProvider oder @Factory, bin mir aber nicht sicher, wie ich diese auf effiziente und wartbare Weise verwenden kann, um Parameter aus einer externen Quelle zu entnehmen, oder wo in meinem aktuellen Modell solche Methoden am besten platziert sind. Die Schwierigkeit, die ich habe, besteht darin, dass ich die Daten nicht unbedingt an @ Test übergeben möchte, sondern jeweils einen Wert (eine URL) und gegen alle mit @ Test-Annotationen versehenen Methoden ausführe.

Meine aktuelle einfache Einrichtung sieht wie folgt aus:

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>

Meine Abnahmeprüfung:

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...

Meine SeiteObjekt:

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...

Meine Selen-Methoden 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...

Meine Treiberbasis-Seite:

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 Anbieterklasse:

public class URLProvider {

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

Finally, eine Konfiguration, die derzeit nur eine BaseUrl enthält:

public interface Config {

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

}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage