Ejecutar las mismas pruebas contra una gran cantidad de sitios web

Tengo la necesidad de ejecutar las mismas pruebas en más de 70 sitios web que son funcionalmente iguales pero tienen máscaras diferentes. Sin embargo, se accede a todos a través de diferentes URL.

Usando TestNG y Java, ¿Cuál sería una manera eficiente de pasar las URL a las pruebas para que yo pueda: a) ejecutar cada prueba en cada sitio e informar sobre el mismo b) ejecutar pruebas en paralelo para ahorrar tiempo (necesidad futura)

Quiero almacenar las URL en un formato tal que esté expuesto a los usuarios finales y configurable por ellos. Idealmente, esto sería en un .csv o alternativamente, como en el archivo testng.xml. Estoy pensando en @DataProvider o @Factory pero no estoy seguro de cómo usarlos de manera eficiente y sostenible para tomar parámetros de una fuente externa o dónde en mi modelo actual estos métodos serían los mejores. La dificultad que tengo es que no quiero pasar los datos necesariamente a @ Test, sino pasar un valor a la vez (una url) y ejecutar todos los métodos anotados de @Test.

Mi configuración simple actual es la siguiente:

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>

Mi prueba de aceptación:

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

Mi objeto de página:

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

Mi página de base de métodos de selenio:

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

Mi página de base de controladores:

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

Clase de proveedor de URL:

public class URLProvider {

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

Finalmente, una configuración que actualmente solo contiene una BaseUrl:

public interface Config {

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

}

Respuestas a la pregunta(1)

Su respuesta a la pregunta