example descargar chrome selenium automated-tests selenium-webdriver testng selenium-grid

selenium - descargar - Comportamiento del controlador que ejecuta pruebas de selenio TestNG paralelas con el proveedor de datos



selenium testing (2)

Realmente no necesita usar una fábrica. Si yo fuera usted, llamaría a este código dentro del método del proveedor de datos:

driver = getBrowser(browser);

A continuación, devuelva las instancias del controlador como una segunda columna de argumentos al método de prueba. Hacerlo de esa manera permite al proveedor de datos generar instancias de navegador. Para mejorar eso, podría usar el patrón de diseño del constructor, en forma de una clase DriverHelper, que podría reemplazar el método getBrowser con una forma de generar una configuración de controlador mucho más específica antes de pasar la instancia del controlador al método de prueba.

NOTA: tenga en cuenta que si alguna vez quiere usar Spring para cargar sus controladores en el futuro, entonces este método no funcionará en absoluto. De hecho, no podrá usar un DataProvider en absoluto. Pero, si no estás usando Spring, entonces diría que esta es la forma más elegante de hacerlo.

Quiero ejecutar pruebas de selenio en TestNg en paralelo que usan el @dataprovider. Idealmente, las pruebas son paralelas por método (una prueba = un método) y no un paralelismo de suite simple por navegador. He leído en alguna parte que se pueden controlar aproximadamente 5 instancias de ChromeDriver a la vez, así que pensé que esto debería ser posible. Más tarde planeo moverme a grid2. Para el desarrollo estoy ejecutando cosas con IntelliJ Idea Test Runner haciendo clic derecho + ejecutar en el archivo de configuración XML.

Tuve problemas para ejecutar mis pruebas en paralelo (en grid2 y localmente), así que creé una muestra de más o menos lo que quiero hacer.

Aquí está mi clase de prueba

package tests; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import org.testng.annotations.*; import java.util.concurrent.TimeUnit; import static org.testng.Assert.assertNotNull; public class ParallelTest { public static final String SEARCH_TERMS = "search-terms"; private WebDriver driver; @BeforeMethod @Parameters({"browser"}) public void beforeMethod(@Optional("chrome") String browser){ driver = getBrowser(browser); driver.manage().deleteAllCookies(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } private WebDriver getBrowser(String browser) { if(browser.equals("chrome")){ System.setProperty("webdriver.chrome.driver", "webdrivers//chromedriver.exe"); return new ChromeDriver(); } return new FirefoxDriver(); } @AfterMethod public void afterMethod(){ driver.quit(); } @Test(description = "Check parallel selenium works.", dataProvider = SEARCH_TERMS) public void parallelSeleniumTest(String searchTerm){ driver.get("http://google.com"); WebElement search = driver.findElement(By.id("gbqfq")); new Actions(driver) .sendKeys(search, searchTerm) .sendKeys(search, Keys.ENTER) .perform(); String firstResult = driver.findElements(By.className("r")).get(0).getText(); assertNotNull(firstResult); System.out.println(firstResult); } @DataProvider(name = SEARCH_TERMS, parallel = true) public Object[][] getSearchTerms(){ return new Object[][]{ {"google"}, {"microsoft"}, {"facebook"}, {"amazon"}, {"apple"}, {"oracle"}, {"yahoo"}, {"jetbrains"}, {"intellij idea"}, {"selenium"}, {"java"}, {"testng"}, {"code"} }; } }

Lancé algunos eventos nativos ya que los uso mucho en mi suite de pruebas.

Y aquí está el archivo de configuración TestNg xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite thread-count="4" name="vfr6-ui-tests" parallel="methods"> <test name="parallel-test-firefox"> <parameter name="browser" value="firefox"/> <classes> <class name="tests.ParallelTest"/> </classes> </test> <test name="parallel-test-chrome"> <parameter name="browser" value="chrome"/> <classes> <class name="tests.ParallelTest"/> </classes> </test> </suite>

Leí que crear instancias de un controlador por prueba suele ser el más sostenible. El problema es que la prueba de Firefox se ejecuta en serie, mientras que la prueba de Chrome arroja todos los puntos de datos como casos de prueba, intenta abrir un tesoro de instancias del navegador y todo falla. Mis pruebas tendrán 10-25 o 300-500 puntos de datos (ciclos entre clientes o clientes x productos).

¿Cuál es la mejor manera de configurar el controlador, el proveedor de datos y el corredor de prueba para lograr el mejor paralelismo en la ejecución de pruebas?


Tuve la misma experiencia sobre dataProvider. En mi caso, utilicé el atributo dataProvider (parallel = true). Hay dos soluciones para su problema.

  1. Use dataProvider y en la clase de prueba y use la anotación de fábrica para su constructor. En el atributo de anotación de fábrica, use dataProvider = "Your dataProvider''s name". En el testng.xml, en lugar de paralelo = métodos, use parallel = instances.

    El inconveniente del enfoque anterior es que cuando obtiene el informe; Puede ser que sea una falla de seguridad, prueba de informe de Eclipse o reporte de informe de GNU, no ve los parámetros pasados ​​por adelantado. Para superar esto, puede usar el siguiente enfoque.

  2. Cree una clase de fábrica e instale su clase de prueba en el método de fábrica utilizando un bucle for. (Comience por el bucle desde 0.) En la clase de prueba, defina un constructor que reciba un parámetro de la clase de fábrica. Defina un proveedor de datos en esta clase de prueba que pueda usar el parámetro (punto de datos) recibido en el constructor. Defina un BeforeMethod o BeforeClass que pueda usar ese parámetro o punto de datos. Sus métodos de prueba deben tener el atributo "dataProvider" apuntando al dataProvider deseado. De nuevo, en testng.xml use parallel = "instances".

    Además, use el bloque try / catch para crear instancias de objetos del controlador y cerrar el navegador. Esto lo ayudará a evitar saltos debido a la falla de la configuración del método tearDown.