2016-03-23 10 views
0

Ich habe einen Test in Gurke, die das Beispiel Tabellenformat verwendet. Könnte ich Cucumber dazu bringen, jede Zeile der Tabelle parallel auszuführen?Gurke - parallele Szenarien laufen lassen

Szenario Outline: e_5_1 prüft Urteil Court Codes in Englisch 2

Given I navigate to the customer portal search screen 
    When I enter DLN, NI and Postcode from row "<user_row>" and access Penalties and disqualifications 
    And click on the endorsement in order to confirm court description from rows "<row1>" to "<row2>" 
Then I Logout 

    Examples: 
    | user_row | row1  | row2  | 
    | 2  | 2  | 51  | 
    | 52  | 52  | 98  | 
    | 99  | 99  | 148  | 
    | 149  | 149  | 198  | 

Normalerweise würde ich laufen test.feature für die Zeilennummer sagen und es würde durch jede Reihe einen nach dem anderen durchlaufen, oder ich konnte Geben Sie die Zeilennummer an, in der sich die Tabellenzeile befindet.

Konnte ich es alle vier Reihen gleichzeitig parallel laufen lassen?

Vielen Dank im Voraus

+0

Nur ein paar Stil Kommentare: das Szenario besser lesen, wenn Sie nicht-IDs verwenden, sondern tatsächlichen Namen verwenden (haben die Schritt-Implementierungen die entsprechenden Lookups tun). Der Schritt "Dann ich abmelden" kann in einem Schritt Nachher (siehe https://github.com/cucumber/cucumber/wiki/Hooks) untergebracht werden. –

Antwort

1

Sie können cucumber-jvm-parallel-plugin Open-Source-Plugin verwenden, die viele Vorteile gegenüber bestehenden Lösungen, aber es ist nur für Java hat. Erhältlich bei Maven repository

<dependency> 
    <groupId>com.github.temyers</groupId> 
    <artifactId>cucumber-jvm-parallel-plugin</artifactId> 
    <version>2.2.0</version> 
    </dependency> 
  1. Zuerst müssen Sie diese Abhängigkeit und Plugin mit erforderlicher Konfiguration in Ihrem Projekt pom-Datei hinzuzufügen.

    <dependencies> 
        <dependency> 
        <groupId>com.github.temyers</groupId> 
        <artifactId>cucumber-jvm-parallel-plugin</artifactId> 
        <version>2.2.0</version> 
        </dependency> 
        <dependency> 
         <groupId>net.masterthought</groupId> 
         <artifactId>cucumber-reporting</artifactId> 
         <version>3.3.0</version> 
        </dependency> 
    </dependencies> 
    
    <plugin> 
        <groupId>com.github.temyers</groupId> 
        <artifactId>cucumber-jvm-parallel-plugin</artifactId> 
        <version>2.2.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. Jetzt unter Plugin fügen Sie einfach unten oben Plugin, das Läufer Klassen von oben Plugin

    <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. Vor zwei Plugins für Gurken Test parallel laufenden Magie tun (vorausgesetzt, Sie Maschine auch erzeugt aufruft haben erweiterte Hardware-Unterstützung).

  4. Streng zur Verfügung gestellt <forkCount>n</forkCount> Hier ist 'n' direkt proportional zu 1) Erweiterte Hardware-Unterstützung und 2) Sie verfügbare Knoten, d. H. Registrierte Browser-Instanzen zu HUB.

  5. Eine wichtige und wichtigsten Änderungen ist Ihr WebDriver Klasse geteilt werden muss, und Sie sollten nicht driver.quit() -Methode implementieren, das Schließen von Shutdown-Hook sorgen ist.

    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. Betrachtet man mehr als 50 Threads ausgeführt werden soll, dh gleiche Anzahl der Browser-Instanzen zu HUB registriert, aber Hub wird sterben, wenn es also genügend Speicher erhalten nicht diese kritische Situation vermeiden Sie mit Hub beginnen soll -DPOOL_MAX = 512 (oder größer) wie in grid2 documentation angegeben.

    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

Verwandte Themen