In
real world application, many scenarios can share common steps. Instead of
writing these steps redundantly, we can place these common steps in background
section and reuse them.
Let’s
see it by an example.
Scenario: Password should be reset successfully Given I am a logged in user When I choose to reset password And provided current password "password123" And provided new password "password3456" Then if the current password & new password are not same, password should be reset successfully Scenario: Password reset failure case Given I am a logged in user When I choose to reset password And provided current password "password123" And provided new password "password123" Then if the current password & new password are same, password should not be reset And user should be notified
As
you see above scenarios, first 3 steps are common in both these scenarios. We
can move these three steps into background section and reuse.
Find
the below working example.
PasswordReset.feature
Feature: Testing reset password functionality Background: Common steps for password reset scenario Given I am a logged in user When I choose to reset password And provided current password "password123" Scenario: Password should be reset successfully When provided new password "password3456" Then if the current password & new password are not same, password should be reset successfully Scenario: Password reset failure case When provided new password "password123" Then if the current password & new password are same, password should not be reset And user should be notified
Passwordutil.java
PasswordResetTest.java
package com.sample.util; public class PasswordUtil { public static boolean resetPassword(String currentPassword, String newPassword) { if (currentPassword.equals(newPassword)) { return false; } return true; } }
PasswordResetTest.java
package com.sample.test; import com.sample.util.PasswordUtil; import cucumber.api.java.en.*; import static org.junit.Assert.*; public class PasswordResetTest { private String currentPassword; private String newPassword; @Given("^I am a logged in user$") public void i_am_a_logged_in_user() throws Exception { System.out.println("User is getting logged in"); } @When("^I choose to reset password$") public void i_choose_to_reset_password() throws Exception { System.out.println("User choose to reset password"); } @When("^provided current password \"([^\"]*)\"$") public void provided_current_password(String arg1) throws Exception { System.out.println("Reading current password"); this.currentPassword = arg1; } @When("^provided new password \"([^\"]*)\"$") public void provided_new_password(String arg1) throws Exception { System.out.println("Reading new password"); this.newPassword = arg1; } @Then("^if the current password & new password are not same, password should be reset successfully$") public void if_the_current_password_new_password_are_not_same_password_should_be_reset_successfully() throws Exception { boolean isResetSuccessful = PasswordUtil.resetPassword(currentPassword, newPassword); assertTrue("Password reset successful", isResetSuccessful); System.out.println("Password reset successful"); } @Then("^if the current password & new password are same, password should not be reset$") public void if_the_current_password_new_password_are_same_password_should_not_be_reset() throws Exception { boolean isResetSuccessful = PasswordUtil.resetPassword(currentPassword, newPassword); assertFalse("Password reset can't happen, since both current, new passwords are same", isResetSuccessful); System.out.println("Password reset can't happen, since both current, new passwords are same"); } @Then("^user should be notified$") public void user_should_be_notified() throws Exception { System.out.println("New passowrd shouldn't be equal to current password"); } }
TestRun.java
package com.sample.main; import org.junit.runner.RunWith; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class) @CucumberOptions(monochrome = true, features = "src/test/java/com/sample/features", glue = "com.sample.test", plugin = { "pretty" }) public class TestRun { }
When
you run above application, you can able to see below messages in console.
Feature: Testing reset password functionality Background: Common steps for password reset scenario # src/test/java/com/sample/features/PasswordReset.feature:3 User is getting logged in Given I am a logged in user # PasswordResetTest.i_am_a_logged_in_user() User choose to reset password When I choose to reset password # PasswordResetTest.i_choose_to_reset_password() Reading current password And provided current password "password123" # PasswordResetTest.provided_current_password(String) Scenario: Password should be reset successfully # src/test/java/com/sample/features/PasswordReset.feature:8 Reading new password When provided new password "password3456" # PasswordResetTest.provided_new_password(String) Password reset successful Then if the current password & new password are not same, password should be reset successfully # PasswordResetTest.if_the_current_password_new_password_are_not_same_password_should_be_reset_successfully() Background: Common steps for password reset scenario # src/test/java/com/sample/features/PasswordReset.feature:3 User is getting logged in Given I am a logged in user # PasswordResetTest.i_am_a_logged_in_user() User choose to reset password When I choose to reset password # PasswordResetTest.i_choose_to_reset_password() Reading current password And provided current password "password123" # PasswordResetTest.provided_current_password(String) Scenario: Password reset failure case # src/test/java/com/sample/features/PasswordReset.feature:12 Reading new password When provided new password "password123" # PasswordResetTest.provided_new_password(String) Password reset can't happen, since both current, new passwords are same Then if the current password & new password are same, password should not be reset # PasswordResetTest.if_the_current_password_new_password_are_same_password_should_not_be_reset() New passowrd shouldn't be equal to current password And user should be notified # PasswordResetTest.user_should_be_notified() 2 Scenarios (2 passed) 11 Steps (11 passed) 0m0.267s
No comments:
Post a Comment