HOME

In the previous tutorial, I have explained Serenity BDD with Cucumber for Web Application. this tutorial, I will explain about the Integration of Serenity with JUnit4.

Pre-Requisite

  1. Java 11 installed
  2. Maven installed
  3. Eclipse or IntelliJ installed

This framework consists of:

  1. Java 11
  2. Maven – 3.8.1
  3. Serenity – 2.6.0
  4. Serenity Maven – 2.6.0
  5. JUnit – 4.13.2
  6. Maven Surefire Plugin – 3.0.0-M5
  7. Maven Failsafe Plugin – 3.0.0-M5
  8. Maven Comiler Plugin – 3.8.1

Implementation Steps

  1. Update Properties section in Maven pom.xml
  2. Add repositories and pluginRepository to Maven pom.xml
  3. Add Serenity and JUnit dependencies to POM.xml
  4. Update Build Section of pom.xml
  5. Create test code under src/test/java folder
  6. Create serenity.conf file under src/test/resources
  7. Create serenity.properties file in the root of the project
  8. Run the tests through commandline which generates Serenity Report

Project Structure

Step 1 – Update Properties section in Maven pom.xml

  <properties>     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     <serenity.version>2.6.0</serenity.version>     <serenity.maven.version>2.6.0</serenity.maven.version>     <junit.version>4.13.2</junit.version>     <maven.surefire.plugin.version>3.0.0-M5</maven.surefire.plugin.version>     <maven.failsafe.plugin.version>3.0.0-M5</maven.failsafe.plugin.version>     <maven.compiler.plugin.version>3.8.1</maven.compiler.plugin.version>     <maven.compiler.source>11</maven.compiler.source>     <maven.compiler.target>11</maven.compiler.target>   </properties> 

Step 2 – Add repositories and pluginRepository to Maven pom.xml

 <repositories>         <repository>             <snapshots>                 <enabled>false</enabled>             </snapshots>             <id>central</id>             <name>bintray</name>             <url>https://jcenter.bintray.com</url>         </repository>     </repositories>     <pluginRepositories>         <pluginRepository>             <snapshots>                 <enabled>false</enabled>             </snapshots>             <id>central</id>             <name>bintray-plugins</name>             <url>https://jcenter.bintray.com</url>         </pluginRepository>     </pluginRepositories> 

Step 3 – Add Serenity and JUnit dependencies to POM.xml

 <dependencies>    <dependency>             <groupId>net.serenity-bdd</groupId>             <artifactId>serenity-core</artifactId>             <version>${serenity.version}</version>             <scope>test</scope>         </dependency>         <dependency>             <groupId>net.serenity-bdd</groupId>             <artifactId>serenity-junit</artifactId>             <version>${serenity.version}</version>             <scope>test</scope>         </dependency>                <dependency>             <groupId>net.serenity-bdd</groupId>             <artifactId>serenity-screenplay</artifactId>             <version>${serenity.version}</version>             <scope>test</scope>         </dependency>                <dependency>             <groupId>net.serenity-bdd</groupId>             <artifactId>serenity-screenplay-webdriver</artifactId>             <version>${serenity.version}</version>             <scope>test</scope>         </dependency>          <dependency>             <groupId>junit</groupId>             <artifactId>junit</artifactId>             <version>${junit.version}</version>             <scope>test</scope>         </dependency>       </dependencies> 

Step 4 – Update Build Section of pom.xml

 <build>         <plugins>             <plugin>                 <groupId>org.apache.maven.plugins</groupId>                 <artifactId>maven-surefire-plugin</artifactId>                 <version>${maven.surefire.plugin.version}</version>                 <configuration>                     <skip>true</skip>                 </configuration>             </plugin>             <plugin>                 <artifactId>maven-failsafe-plugin</artifactId>                 <version>${maven.failsafe.plugin.version}</version>                 <configuration>                     <includes>                         <include>**/*.java</include>                     </includes>                     <parallel>methods</parallel>                     <useUnlimitedThreads>true</useUnlimitedThreads>                 </configuration>                 <executions>                     <execution>                         <goals>                             <goal>integration-test</goal>                             <goal>verify</goal>                         </goals>                     </execution>                 </executions>             </plugin>             <plugin>                 <groupId>org.apache.maven.plugins</groupId>                 <artifactId>maven-compiler-plugin</artifactId>                 <version>${maven.compiler.plugin.version}</version>                 <configuration>                     <source>${maven.compiler.source}</source>                     <target>${maven.compiler.target}</target>                 </configuration>             </plugin>            <plugin>                <groupId>net.serenity-bdd.maven.plugins</groupId>                <artifactId>serenity-maven-plugin</artifactId>                <version>${serenity.version}</version>                <dependencies>                    <dependency>                        <groupId>net.serenity-bdd</groupId>                        <artifactId>serenity-single-page-report</artifactId>                        <version>${serenity.version}</version>                   </dependency>                                </dependencies>                <configuration>                    <tags>${tags}</tags>                    <reports>single-page-html</reports>                 </configuration>                <executions>                   <execution>                       <id>serenity-reports</id>                       <phase>post-integration-test</phase>                       <goals>                           <goal>aggregate</goal>                       </goals>                    </execution>                </executions>            </plugin>         </plugins>     </build> </project> 

Step 5 - Create test code under src/test/java folder

 @RunWith(SerenityRunner.class) public class LoginPageDefinitions {  	@Managed 	WebDriver driver;  	@Steps 	StepLoginPage loginPage;  	@Steps 	StepDashboardPage dashPage;  	@Steps 	StepForgetPasswordPage forgetpasswordPage;  	@Test 	@Title("Login to application should be successful") 	public void sucessfulLogin() {  		// Given 		loginPage.open();  		// When 		loginPage.inputUserName("Admin"); 		loginPage.inputPassword("admin123"); 		loginPage.clickLogin();  		// Then 		dashPage.loginVerify(); 	}  	@Test 	@Title("Login to application should be unsuccessful with error message") 	public void unsucessfulLogin() throws InterruptedException {  		// Given 		loginPage.open();  		// When 		loginPage.inputUserName("abc"); 		loginPage.inputPassword("abc12"); 		loginPage.clickLogin();  		// Then 		String actualErrorMessage = loginPage.errorMessage(); 		Assert.assertEquals("Invalid credentials", actualErrorMessage); 	}  	@Test 	@Title("Verify Forgot your password link") 	public void clickForgetPasswordLink() {  		// Given 		loginPage.open();  		// When 		loginPage.clickForgetPasswordLink();  		// Then 		Assert.assertTrue(forgetpasswordPage.ForgetPasswordPage()); 	}  } 
  1. The JUnit test can be run using the Serenity test runner.
  2. The @Steps annotation marks a Serenity step library.
  3. Create the test following the Given/When/Then pattern and using step methods from the step library.
  4. The @Title annotation lets you provide your own title for this test in the test reports.
 public class StepLoginPage extends PageObject {  	@Step("Enter Username") 	public void inputUserName(String userName) { 		$(By.name("txtUsername")).sendKeys((userName)); 	}  	@Step("Enter Password") 	public void inputPassword(String passWord) { 		$(By.name("txtPassword")).sendKeys((passWord)); 	}  	@Step("Click Submit Button") 	public void clickLogin() { 		$(By.name("Submit")).click(); 	}  	@Step("Error Message on unsuccessful login") 	public String errorMessage() { 		String actualErrorMessage = $(By.id("spanMessage")).getText(); 		return actualErrorMessage; 	}  	@Step("Click Forget Password Link") 	public void clickForgetPasswordLink() { 		$(By.linkText("Forgot your password?")).click(); 	}  } 

StepDashBoardPage.java

 public class StepDashboardPage extends PageObject {  	@Step("Successful login") 	public void loginVerify() { 		String dashboardTitle = $(By.id("welcome")).getText(); 		assertThat(dashboardTitle, containsString("Welcome")); 	} } 

StepForgetPasswordPage.java

 public class StepForgetPasswordPage extends PageObject {  	@Step("Verify Forget Password Page ") 	public boolean ForgetPasswordPage() { 		Boolean resetPasswordButton = $(By.id("btnSearchValues")).isDisplayed();  		return resetPasswordButton; 	} }  

The JUnit Serenity integration provides some special support for Serenity Page Objects. In particular, Serenity will automatically instantiate any PageObject fields in your JUnit test. When you declare a field of type StepLoginPage in the test, Serenity will instantiate it for you. The page is automatically instantiated and ready to be used.

 @Managed                                                                 WebDriver driver; 

@Managed declares a WebDriver instance that will be managed by Serenity. The WebDriver instance will be initialized automatically.

The driver parameter lets you define what WebDriver driver you want to run these tests in. Possible values include firefox, chrome, iexplorer, phantomjs, appium, safari, edge and htmlunit . Default value of driver is Firefox.

 @Managed(driver="chrome") 

Step 6 - Create serenity.conf file under src/test/resources

Serenity.conf file is used to specify various features like type of webdriver used, various test environments, run test in headless mode and many more options.

 webdriver {     driver = firefox }  drivers {   windows {     webdriver.chrome.driver = src/test/resources/webdriver/windows/chromedriver.exe     webdriver.gecko.driver = src/test/resources/webdriver/windows/geckodriver.exe   } }  environments {   default {     webdriver.base.url = "https://opensource-demo.orangehrmlive.com/"   }   dev {     webdriver.base.url = "https://opensource-demo.orangehrmlive.com/dev"   }   staging {     webdriver.base.url = "https://opensource-demo.orangehrmlive.com/staging"   }   prod {     webdriver.base.url = "https://opensource-demo.orangehrmlive.com/prod"   } }  

Step 7 - Create serenity.properties file in the root of the project

 serenity.project.name = Serenity and Junit Demo  

Step 8 - Run the tests through commandline which generates Serenity Report

Open commandline and go to the location where pom.xml of the project is present and type the below command.

 mvn clean verify 

Below is the execution status.

There are 2 type of reports are generated.

  1. Index.html

2. Emailable Report (Serenity-Summary.html)

These reports are present under /target/site/serenity.

Skipping the tests

In Serenity, you use the @Pending annotation, either for a test or for a @Step-annotated method, to indicate that the scenario is still being implemented and that the results are not available yet. These tests appear as 'Pending' (shown in blue) in the test reports.

 @Test 	@Pending 	@Title("Verify Forgot your password link") 	public void clickForgetPasswordLink() {  		// Given 		loginPage.open();  		// When 		loginPage.clickForgetPasswordLink();  		// Then 		Assert.assertTrue(forgetpasswordPage.ForgetPasswordPage()); 	} 

Tests marked with @Ignore will appear as 'Ignored' (from JUnit) appears as grey in the test reports.

We are done! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!


This post is ad-supported