Serenity running in parallel - Serenity part 4/4
Tags: serenity, parallel, automation, java
Published: 2019-10-05 07:32:59

---
title: Serenity running in parallel - Serenity part 4/4
published: true
description: 
tags: #serenity #parallel #automation #java
---
I'm back with the last part of Serenity, you can definitely check the previous parts in here:
[Serenity part 1](https://dev.to/cuongld2/serenity-automation-framework-part-1-4-automation-test-with-api-2mb5)
[Serenity part 2](https://dev.to/cuongld2/serenity-automation-framework-part-2-4-automation-test-with-ui-using-cucumber-3n7b)
[Serenity part 3](https://dev.to/cuongld2/serenity-automation-framework-part-3-4-automation-test-for-ui-with-screenplay-pattern-and-junit-31lk)

In this blog post, we will go through the setup step for how to run serenity parallel tests with cucumber using maven fail safe plugin with cucumber-jvm-parallel-plugin.


You can definitely check [the serenity book](https://serenity-bdd.github.io/theserenitybook/latest/) for details.

What you will need to do is simply this:

1.POM file:

maven failsafe plugin defined for running parallel test for each test class.

````javascript
<plugin>
         <artifactId>maven-failsafe-plugin</artifactId>
         <version>2.18</version>
                <configuration>
                    <parallel>classes</parallel>
                    <threadCount>2</threadCount>
                </configuration>
</plugin>

```


````javascript
<plugin>
                <groupId>com.github.temyers</groupId>
                <artifactId>cucumber-jvm-parallel-plugin</artifactId>
                <version>4.2.0</version>
                <executions>
                    <execution>
                        <id>generateRunners</id>
                        <phase>generate-test-sources</phase>
                        <goals>
                            <goal>generateRunners</goal>
                        </goals>
                        <configuration>
                            <!-- Mandatory -->
                            <!-- List of package names to scan for glue code. -->
                            <glue>
                                <package>ui.cucumber</package>
                            </glue>
                            <parallelScheme>FEATURE</parallelScheme>
                        </configuration>
                    </execution>
                </executions>
</plugin>

```
cucumber jvm parallel plugin to generate runners when you execute test.
Without it , the parallel test won't work.

2.Features file defined for the test:
 In this test we will run the test for facebook login page and qcCoccoc login page.

- feature file for facebook login
````javascript
  @Login
  Scenario Outline: User login successfully with correct
    Given Navigate to facebook login page
    When Login facebook with '<phone>' and '<password>'
    Then Should navigate to facebook homepage
    Examples:
      |phone|password|
      |xxxxx|xxxxxx|
```
- feature file for qcCoccoc login

````javascript

  @Login
  Scenario Outline: Login successfully with email and password
    Given Navigate to quang cao coc coc login site
    When Login with '<email>' and '<password>'
    Then Should navigate to home page site
    Examples:
      |email|password|
      |xxxxx|xxxxx|
```
3.Tests defined in cucumber format:

- For facebook login page:

````javascript
@Steps
    private pages.facebook.LoginPage loginPage_facebook;

    @Given("^Navigate to facebook login page$")
    public void navigateToFacebookLoginPage() {

        loginPage_facebook.navigate();

    }


    @When("^Login facebook with '(.*)' and '(.*)'$")
    public void loginFacebookWithPhoneAndPassword(String phone, String password) {

        loginPage_facebook.login(phone,password);

    }

    @Then("^Should navigate to facebook homepage$")
    public void shouldNavigateToFacebookHomepage() {

        WebDriverWait wait = new WebDriverWait(getDriver(),2);
        wait.until(ExpectedConditions.not(ExpectedConditions.urlContains("login")));
        softAssertImpl.assertAll();

    }

```
First user navigate to facebook login page, then after fill in the credential details, we will assert whether the url still contain "login"
text or not.

-For qcCoccoc login page, the step is pretty the same:

````javascript
public class LoginPage extends BaseTest {

    @Steps
    private pages.qcCocCoc.LoginPage loginPage_pageobject;


    @cucumber.api.java.en.Given("^Navigate to quang cao coc coc login site$")
    public void navigateToQuangCaoCocCocLoginSite() {

        loginPage_pageobject.open();

    }

    @When("^Login with '(.*)' and '(.*)'$")
    public void loginWithEmailAndPassword(String email, String password) {

        loginPage_pageobject.login(email,password);

    }

    @Then("^Should navigate to home page site$")
    public void shouldNavigateToHomePageSite() {
        WebDriverWait wait = new WebDriverWait(getDriver(),2);
        wait.until(ExpectedConditions.urlContains("welcome"));
        softAssertImpl.assertAll();

    }

    @Then("^Should prompt with '(.*)'$")
    public void shouldPromptWithErrormessage(String errorMessage) {

        softAssertImpl.assertThat("Verify message error",loginPage_pageobject.getMessageError().contains(errorMessage),true);
        softAssertImpl.assertAll();

    }
}

```

4.Run the tests:
- To run the test simply using mvn command line

mvn clean verify -Dcucumber.options="--tags @Login"

This will run the cucumber test has tag @Login


- To run only the facebook test with serenity report, run command line:


mvn clean verify -Dtest=ui.cucumber.facebook.AcceptanceTest serenity:aggregate 

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/o8jgf9qd30lj1qtyjrfx.png)

You can check out the source code in [github](https://github.com/cuongld2/serenityguideline)

Leave a heart or comment if you have any!!

Peace!!!

Notes: If you feel this blog help you and want to show the appreciation, feel free to drop by :

[<img src="https://thepracticaldev.s3.amazonaws.com/i/cno42wb8aik6o9ek1f89.png">](https://www.buymeacoffee.com/dOaeSPv
)

This will help me to contributing more valued contents.