Data-driven test design

 Why Not Write All 10 Fields in One Step?

When user fills form with "Hari", "Taraka", "samplemail@gmail.com", "2985725983", "Hyderabad", "Male", "01/01/1990", "Engineer", "Single", "Yes"

Problems:

  • Hard to read
  • Hard to maintain
  • No clarity on which value belongs to which field
  • Error-prone if field order changes


=======================================================

#Data Driven:

@facebooklogin

Scenario: Facebook login page

Given user signing into facebook login page

When user login into facebook application

| Hari                                 |

| Taraka                             |

| samplemail@gmail.com |

| 2985725983         |

Then facebook homepage is displayed



If you run this you will get error, because we are not defined in StepDefiniation file

FAILED: io.cucumber.testng.AbstractTestNGCucumberTests.runScenario("Facebook login page", "Application Login")

Runs Cucumber Scenarios

io.cucumber.testng.UndefinedStepException: The step 'user signing into facebook login page' and 2 other step(s) are undefined.

You can implement these steps using the snippet(s) below:


@When("user login into facebook application")

public void user_login_into_facebook_application(io.cucumber.datatable.DataTable dataTable) {

// Write code here that turns the phrase above into concrete actions

// For automatic transformation, change DataTable to one of

// E, List<E>, List<List<E>>, List<Map<K,V>>, Map<K,V> or

// Map<K, List<V>>. E,K,V must be a String, Integer, Float,

// Double, Byte, Short, Long, BigInteger or BigDecimal.

//

// For other transformations you can register a DataTableType.

throw new io.cucumber.java.PendingException();

}



1. Convert to Map<K, V>

Best for key-value pairs (used for form-like data):


Map<String, String> data = dataTable.asMap();

System.out.println("First Name: " + data.get("FirstName"));


2. Convert to List<Map<String, String>>

Best when you have multiple sets of key-value data (like multiple users):


When user logs into facebook with multiple accounts

| FirstName     | LastName     | Email                 |

| Hari           | Taraka         | hari@gmail.com      |

| John          | Doe           | john.doe@gmail.com |



List<Map<String, String>> rows = dataTable.asMaps();

for (Map<String, String> row : rows) {

System.out.println("Email: " + row.get("Email"));

}


3. Convert to List<List<String>>

Use when no headers:

When user enters following fields
| Hari | Taraka | hari@gmail.com |


List<List<String>> data = dataTable.asLists();

System.out.println(data.get(0).get(0)); // Hari

================================COMPLETE CODE=========================================



Feature file:


Feature: Application Login

#Data Driven:

@facebooklogin

Scenario: Facebook login page

Given user signing into facebook login page

When user login into facebook application

| Hari |

| Taraka |

| samplemail@gmail.com |

| 2985725983 |

Then facebook homepage is displayed



StepDefiniation file:


@Given("user signing into facebook login page")

public void user_signing_into_facebook_login_page() {

// Write code here that turns the phrase above into concrete actions

System.out.println("User logging in facebook page");

}

@When("user login into facebook application")

public void user_login_into_facebook_application(List<String> data) {

System.out.println(data.get(0));

System.out.println(data.get(1));

System.out.println(data.get(2));

System.out.println(data.get(3));

}

//Note: It takes a list of strings (data) and prints out user details such as the name and email address.


@Then("facebook homepage is displayed")

public void facebook_homepage_is_displayed() {

System.out.println("facebook homepage is displayed");

System.out.println("=================================================");

}



TestNGRunner file:


package cucumberOptions;


import io.cucumber.testng.AbstractTestNGCucumberTests;

import io.cucumber.testng.CucumberOptions;


@CucumberOptions(features="src/test/java/features", glue ="stepDefinitions", tags= "@facebooklogin", monochrome=true)

public class TestNGRunner extends AbstractTestNGCucumberTests {

}




Output:


User logging in facebook page

Hari

Taraka

samplemail@gmail.com

2985725983

facebook homepage is displayed