java cucumber testng cucumber-jvm

java - Cómo ejecutar el archivo de características de pepino en paralelo



cucumber testng (4)

Para aprovechar al máximo TestNG, puede utilizar el marco QAF extensión de terceros de Testng. Admite múltiples sintaxis bdd, incluido el pepinillo, utilizando GherkinFactory . Mientras usa BDD con QAF, puede aprovechar las características de cada TestNG, incluidos los proveedores de datos, la configuración de ejecución paralela de diferentes maneras (grupos / pruebas / métodos), oyentes TestNG.

QAF considera cada escenario como prueba TestNG y Escenario de escenario como prueba basada en datos TestNG. Como qaf proporciona gestión de controladores y gestión de recursos incorporada, no necesita escribir una sola línea de código para la gestión de controladores o la gestión de recursos. Todo lo que necesita hacer es crear el archivo de configuración TestNG xml según sus requisitos, ya sea para ejecutar métodos paralelos (escenarios) o grupos o prueba xml en uno o más navegadores.

Permite diferentes combinaciones de configuración posibles. A continuación se muestra la configuración xml para abordar esta pregunta que ejecutará escenarios en dos navegadores y en paralelo. También puede configurar el número de subprocesos para cada navegador como configuración estándar de TestNG xml.

<suite name="AUT Test Automation" verbose="0" parallel="tests"> <test name="Test-on-chrome"> <parameter name="scenario.file.loc" value="resources/features" /> <parameter name="driver.name" value="chromeDriver" /> <classes> <class name="com.qmetry.qaf.automation.step.client.gherkin.GherkinScenarioFactory" /> </classes> </test> <test name="Test-on-FF"> <parameter name="scenario.file.loc" value="resources/features" /> <parameter name="driver.name" value="firefoxDriver" /> <classes> <class name="com.qmetry.qaf.automation.step.client.gherkin.GherkinScenarioFactory" /> </classes> </test> </suite>

Más información sobre el último BDDTestFactory2 admite la syntax derivada de QAF BDD, Jbehave y gherkin. Admite metadatos de qaf bdd como etiquetas y ejemplos de pepinillo. Puede aprovechar los proveedores de datos incorporados para proporcionar datos de prueba en XML / JSON / CSV / EXCEL / DB utilizando metadatos en BDD.

Tengo debajo los archivos de características (archivos de características separadas) en src / test / resources / feature / y me gustaría ejecutarlos en paralelo. Me gusta: un archivo de características debe ejecutarse en Chrome y otro debe ejecutarse en Firefox como se menciona en el nombre de @Tags.

Feature: Refund item @chrome Scenario: Jeff returns a faulty microwave Given Jeff has bought a microwave for $100 And he has a receipt When he returns the microwave Then Jeff should be refunded $100 Feature: Refund Money @firefox Scenario: Jeff returns the money Given Jeff has bought a microwave for $100 And he has a receipt When he returns the microwave Then Jeff should be refunded $100

¿Alguien puede ayudarme a lograr esto? Estoy usando la versión 1.2.2 de cucumber-java, y AbstractTestNGCucumberTests como corredor. Además, avíseme cómo puedo crear un Test Runner dinámicamente usando archivos de características y hacer que se ejecuten en paralelo.


Pepino no admite ejecución paralela fuera de la caja. Lo he intentado, pero no es amigable.

  1. Tenemos que usar la capacidad de maven para invocarlo en paralelo. link referencia
  2. También hay un proyecto github que utiliza un complemento personalizado para ejecutar en paralelo. Consulte cucumber-jvm-parallel-plugin

Si todo lo que espera es poder ejecutar varias funciones en paralelo, puede intentar hacer lo siguiente:

  • Duplique la clase AbstractTestNGCucumberTests en su proyecto de prueba y establezca el atributo parallel=true en el método anotado @DataProvider .

Dado que el dataprovider-thread-count predeterminado de TestNG es 10 y ahora que le ha indicado a TestNG que ejecute features en paralelo, debe comenzar a ver que sus archivos de características se ejecuten en paralelo.

Pero entiendo que los informes de Pepino no son inherentemente seguros para subprocesos, por lo que sus informes pueden parecer confusos.


Actualización: la versión 4.0.0 está disponible en el repositorio central de maven con un montón de cambios. Para más detalles ir aquí.

Actualización: la versión 2.2.0 está disponible en el repositorio central de maven.

Puede usar el complemento de código abierto cucumber-jvm-parallel-plugin que tiene muchas ventajas sobre las soluciones existentes. Disponible en repository maven

<dependency> <groupId>com.github.temyers</groupId> <artifactId>cucumber-jvm-parallel-plugin</artifactId> <version>2.1.0</version> </dependency>

  1. Primero debe agregar este complemento con la configuración requerida en el archivo pom de su proyecto.

    <plugin> <groupId>com.github.temyers</groupId> <artifactId>cucumber-jvm-parallel-plugin</artifactId> <version>2.1.0</version> <executions> <execution> <id>generateRunners</id> <phase>generate-test-sources</phase> <goals> <goal>generateRunners</goal> </goals> <configuration> <!-- Mandatory --> <!-- comma separated list of package names to scan for glue code --> <glue>foo, bar</glue> <outputDirectory>${project.build.directory}/generated-test-sources/cucumber</outputDirectory> <!-- The directory, which must be in the root of the runtime classpath, containing your feature files. --> <featuresDirectory>src/test/resources/features/</featuresDirectory> <!-- Directory where the cucumber report files shall be written --> <cucumberOutputDir>target/cucumber-parallel</cucumberOutputDir> <!-- comma separated list of output formats json,html,rerun.txt --> <format>json</format> <!-- CucumberOptions.strict property --> <strict>true</strict> <!-- CucumberOptions.monochrome property --> <monochrome>true</monochrome> <!-- The tags to run, maps to CucumberOptions.tags property you can pass ANDed tags like "@tag1","@tag2" and ORed tags like "@tag1,@tag2,@tag3" --> <tags></tags> <!-- If set to true, only feature files containing the required tags shall be generated. --> <filterFeaturesByTags>false</filterFeaturesByTags> <!-- Generate TestNG runners instead of default JUnit ones. --> <useTestNG>false</useTestNG> <!-- The naming scheme to use for the generated test classes. One of ''simple'' or ''feature-title'' --> <namingScheme>simple</namingScheme> <!-- The class naming pattern to use. Only required/used if naming scheme is ''pattern''.--> <namingPattern>Parallel{c}IT</namingPattern> <!-- One of [SCENARIO, FEATURE]. SCENARIO generates one runner per scenario. FEATURE generates a runner per feature. --> <parallelScheme>SCENARIO</parallelScheme> <!-- This is optional, required only if you want to specify a custom template for the generated sources (this is a relative path) --> <customVmTemplate>src/test/resources/cucumber-custom-runner.vm</customVmTemplate> </configuration> </execution> </executions> </plugin>

  2. Ahora agregue el complemento a continuación justo debajo del complemento que invocará las clases de corredor generadas por el complemento anterior

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19</version> <configuration> <forkCount>5</forkCount> <reuseForks>true</reuseForks> <includes> <include>**/*IT.class</include> </includes> </configuration> </plugin>

  3. Los dos complementos anteriores harán magia para la prueba de pepino que se ejecuta en paralelo (siempre que su máquina también tenga soporte de hardware avanzado).

  4. Estrictamente proporcionado <forkCount>n</forkCount> aquí ''n'' es directamente proporcional a 1) Soporte de hardware avanzado y 2) a los nodos disponibles, es decir, instancias de navegador registradas en HUB.

  5. Uno de los cambios más importantes y más importantes es que su clase WebDriver debe COMPARTIRSE y no debe implementar el método driver.quit (), ya que el cierre se realiza mediante el gancho de apagado.

    import cucumber.api.Scenario; import cucumber.api.java.After; import cucumber.api.java.Before; import org.openqa.selenium.OutputType; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.events.EventFiringWebDriver; public class SharedDriver extends EventFiringWebDriver { private static WebDriver REAL_DRIVER = null; private static final Thread CLOSE_THREAD = new Thread() { @Override public void run() { REAL_DRIVER.close(); } }; static { Runtime.getRuntime().addShutdownHook(CLOSE_THREAD); } public SharedDriver() { super(CreateDriver()); } public static WebDriver CreateDriver() { WebDriver webDriver; if (REAL_DRIVER == null) webDriver = new FirefoxDriver(); setWebDriver(webDriver); return webDriver; } public static void setWebDriver(WebDriver webDriver) { this.REAL_DRIVER = webDriver; } public static WebDriver getWebDriver() { return this.REAL_DRIVER; } @Override public void close() { if (Thread.currentThread() != CLOSE_THREAD) { throw new UnsupportedOperationException("You shouldn''t close this WebDriver. It''s shared and will close when the JVM exits."); } super.close(); } @Before public void deleteAllCookies() { manage().deleteAllCookies(); } @After public void embedScreenshot(Scenario scenario) { try { byte[] screenshot = getScreenshotAs(OutputType.BYTES); scenario.embed(screenshot, "image/png"); } catch (WebDriverException somePlatformsDontSupportScreenshots) { System.err.println(somePlatformsDontSupportScreenshots.getMessage()); } } }

  6. Teniendo en cuenta que desea ejecutar más de 50 subprocesos, es decir, ninguna de las instancias del navegador está registrada en HUB, pero Hub morirá si no tiene suficiente memoria, por lo tanto, para evitar esta situación crítica, debe iniciar el hub con -DPOOL_MAX = 512 (o más grande) como se indica en la documentación de grid2 .

    Really large (>50 node) Hub installations may need to increase the jetty threads by setting -DPOOL_MAX=512 (or larger) on the java command line.

    java -jar selenium-server-standalone-<version>.jar -role hub -DPOOL_MAX=512