Cucumber – Annotations

Annotation is a predefined text, which holds a specific meaning. It lets the compiler/interpreter know, what should be done upon execution. Cucumber has got the following few annotations −

  • Given −
    • It describes the pre-requisite for the test to be executed.
    • Example − GIVEN I am a Facebook user
  • When −
    • It defines the trigger point for any test scenario execution.
    • Example − WHEN I enter “<username>”
  • Then −
    • Then holds the expected result for the test to be executed.
    • Example − THEN login should be successful.
  • And −
    • It provides the logical AND condition between any two statements. AND can be used in conjunction with GIVEN, WHEN and THEN statement.
    • Example − WHEN I enter my “<username>” AND I enter my “<password>”
  • But −
    • It signifies logical OR condition between any two statements. OR can be used in conjunction with GIVEN, WHEN and THEN statement.
    • Example − THEN login should be successful. BUT home page should not be missing.
  • Scenario −
    • Details about the scenario under the test needs to be captured after the keyword “Scenario:”
    • Example −Scenario:GIVEN I am a Facebook userWHEN I enter myAND I enter myTHEN login should be successful.BUT home page should not be missing.
  • Scenario Outline − (To be covered later)
  • Examples − (To be covered later)
  • Background −
    • Background generally has the instruction on what to setup before each scenario runs.
      • Example −Background:Go to Facebook home page.

Example Scenario

Let’s automate a scenario in order to understand annotations better.

Step 1

Create a Maven Test Project named as AnnotationTest.

  • Go to File → New → Others → Maven → Maven Project → Next.
  • Provide group Id (group Id will identify your project uniquely across all projects).
  • Provide artifact Id (artifact Id is the name of the jar without version. You can choose any name which is in lowercase).
  • Click on Finish.
  • Open pom.xml −
    • Go to package explorer on the left hand side of Eclipse.
    • Expand the project AnnotationTest.
    • Locate pom.xml file.
    • Right-click and select the option, Open with “Text Editor”.
  • Add dependency for Selenium − This will indicate Maven, which Selenium jar files are to be downloaded from the central repository to the local repository.
    • Open pom.xml is in edit mode, create dependencies tag (<dependencies></dependencies>), inside the project tag.
    • Inside the dependencies tag, create dependency tag (<dependency></dependency>).
    • Provide the following information within the dependency tag.
<dependency> 
   <groupId>org.seleniumhq.selenium</groupId> 
   <artifactId>selenium-java</artifactId> 
   <version>2.47.1</version> 
</dependency>
  • Add dependency for Cucumber-Java − This will indicate Maven, which Cucumber files are to be downloaded from the central repository to the local repository.
    • Create one more dependency tag.
    • Provide following information within the dependency tag.
<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-java</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Add dependency for Cucumber-JUnit − This will indicate Maven, which Cucumber JUnit files are to be downloaded from the central repository to the local repository.
    • Create one more dependency tag.
    • Provide the following information within the dependency tag.
<dependency> 
   <groupId>info.cukes</groupId> 
   <artifactId>cucumber-junit</artifactId> 
   <version>1.0.2</version> 
   <scope>test</scope> 
</dependency>
  • Add dependency for JUnit − This will indicate Maven, which JUnit files are to be downloaded from the central repository to the local repository.
    • Create one more dependency tag.
    • Provide the following information within the dependency tag.
<dependency> 
   <groupId>junit</groupId> 
   <artifactId>junit</artifactId> 
   <version>4.10</version> 
   <scope>test</scope> 
</dependency>
  • Verify binaries.
    • Once pom.xml is edited successfully, save it.
    • Go to Project → Clean − It will take a few minutes.

Step 2

Create a package named Annotation under src/test/java

  • Select the newly created project.
  • Right-click and select ‘New’.
  • Select option as ‘Package’.
  • Name it as ‘Annotation’.
  • Save it.

Step 3

Create a feature file named annotation.feature.

  • Select and right-click on the package outline.
  • Click on ‘New’ file.
  • Give the file a name such as outline.feature.
  • Write the following text within the file and save it.
Feature: annotation 
#This is how background can be used to eliminate duplicate steps 

Background: 
   User navigates to Facebook Given 
   I am on Facebook login page 

#Scenario with AND 
Scenario: 
   When I enter username as "TOM"
   And I enter password as "JERRY" 
   Then Login should fail 

#Scenario with BUT 
Scenario: 
   When I enter username as "TOM" 
   And I enter password as "JERRY" 
   Then Login should fail 
   But Relogin option should be available

Step 4

Create a step definition file.

  • Select and right-click on the package outline.
  • Click on ‘New’ file.
  • Give the file name as annotation.java
  • Write the following text within the file and save it.
package Annotation; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

import cucumber.annotation.en.Given; 
import cucumber.annotation.en.Then; 
import cucumber.annotation.en.When; 

public class annotation { 
   WebDriver driver = null; 
   @Given("^I am on Facebook login page$") 
	
   public void goToFacebook() { 
      driver = new FirefoxDriver(); 
      driver.navigate().to("https://www.facebook.com/"); 
   }
	
   @When("^I enter username as \"(.*)\"$") 
   public void enterUsername(String arg1) {   
      driver.findElement(By.id("email")).sendKeys(arg1); 
   }
	
   @When ("^I enter password as \"(.*)\"$") 
   public void enterPassword(String arg1) {
      driver.findElement(By.id("pass")).sendKeys(arg1);
      driver.findElement(By.id("u_0_v")).click(); 
   } 
	
   @Then("^Login should fail$") 
   public void checkFail() {  
      if(driver.getCurrentUrl().equalsIgnoreCase(
         "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ 
            System.out.println("Test1 Pass"); 
      } else { 
         System.out.println("Test1 Failed"); 
      } 
      driver.close(); 
   }
	
   @Then("^Relogin option should be available$") 
   public void checkRelogin() { 
      if(driver.getCurrentUrl().equalsIgnoreCase(
         "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ 
            System.out.println("Test2 Pass"); 
      } else { 
         System.out.println("Test2 Failed"); 
      } 
      driver.close(); 
   }
} 

Step 5

Create a runner class file.

  • Select and right-click on the package outline.
  • Click on ‘New’ file.
  • Give the file a name, such as runTest.java
  • Write the following text within the file and save it.
package Annotation; 

import org.junit.runner.RunWith; 
import cucumber.junit.Cucumber; 

@RunWith(Cucumber.class) 
@Cucumber.Options(format = {"pretty", "html:target/cucumber"}) 

public class runTest { }

Step 6

Run the test using option −

  • Select runTest.java file from the package explorer.
  • Right-click and select the option ‘Run as’
  • Select JUnit test.

You will observe the following things when you run this class file −

  • Facebook opens in a new Firefox web-browser instance.
  • TOM will be passed as an input to the username field.
  • JERRY will be passed as an input to the password field.
  • Login will be clicked.
  • Message will be displayed on the browser regarding unsuccessful login.
  • In the console, you will see “Test Pass” printed
  • Step result 1. to 5. Will be re-executed for username as “” and password as “”.

Leave a Reply