Java Selenium Cucumber Excel数据驱动
Java Sellinum Cucumber Excell data driven
需要根据 Excel 文件中的给定“键”获取“值”
我有 excel 个文件
文件名测试 xlsx
和 sheet 姓名 sheet1
And sheet 包含以下键值对 and。 JIRA 票证是唯一的。
Test case description
testdata key
Testdatavalue
testdata2 key
Testdata2 Value
testdata3 key
Testdata3 value
Sampiletest description1
Testcase-jira-1
user1id
Harshadh
Password
123ggg
Sampiletest2 discription
Testcase-jira-2
user2
Ramu
Password123
333ggg
Sampiletest3 discription
Test case jira-3
user3
latha
Password556
73hhh
最多 N 行
这里,我需要使用Java Selenium Cucumber 以如下方式获取数据。我将使用上面的测试数据通过 BDD 方式传入 Cucumber step definition
class 文件。
如何获取definition
文件中的数据
1)如果从当前行传递键值,我们如何获取值的值,为 webSeleinum 元素提供测试输入
示例第 4 行数据
Sampiletest3 discription|Test case jira-3| user3|latha|Password556|73hhh
.....
如果我调用“user3”应该return“Password556”
我需要获取值的任何行都以同样的方式。
请指导我
我建议将场景的所有数据放入 Gherkin 文档中,但您可能有从 excel 中提取数据的有效用例。但是,根据我的经验,这类要求很少见。不推荐的原因是,您的 BDD 功能文件是您的要求,应该包含正确级别的信息来记录系统的预期行为。如果您的数据来自 excel,那么它只会让需求阅读变得更加困难,并且难以维护。
也就是说,如果您有充分的理由将这些数据存储在 excel 中,您可以使用 NoCodeBDD 轻松实现。您所要做的就是映射列名称并上传 excel,其余的由该工具处理。请检查此 .gif 以了解它是如何完成的。 https://nocodebdd.live/examples-using-excel
免责声明:我是NoCodeBDD的创始人。
如果您使用的是 Junit5,这里有一个如何完成的示例 https://newbedev.com/data-driven-testing-in-cucumber-using-excel-files-code-example
您可以使用外部数据源来提供使用 qaf-cucumber 的示例。它将能够提供数据文件,用于提供来自外部数据源的示例,包括 csv
、json
、xml
、excel
文件或数据库查询。
您可以试试下面的代码。
特征文件:
- 在示例中,您可以提供行号和 sheet 名称以使用数据进行迭代。
Scenario Outline: Login to the application with multiple users.
Given get data from datasheet with "<test_id>" and "<sheetName>"
And login to the application
Examples:
| test_id | sheetName |
| 1 | Login |
| 2 | Login |
Excel数据:
从excel读取数据并将其存储在hashmap
:
- 创建一个class来读取数据(例子:ExcelReader)
- 使用
org.apache.poi.ss.usermodel
和 org.apache.poi.xssf.usermodel
导入
public class ExcelReader {
private File file;
private FileInputStream inputStream;
private String testID;
private String sheetName;
private int testIdColumn;
private int numberOfColumns;
private XSSFCell cell;
public HashMap<String, String> fieldsAndValues;
public ExcelReader(String testId, String sheetName) {
file = new File(System.getProperty("user.dir") + "Excel location path");
try {
inputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
System.out.println("File not found at given location: " + e);
}
this.testID = testId;
this.sheetName = sheetName;
this.readExcelAndCreateHashMapForData();
}
public HashMap<String, String> readExcelAndCreateHashMapForData() {
try {
fieldsAndValues = new HashMap<String, String>();
XSSFWorkbook workBook = new XSSFWorkbook(inputStream);
XSSFSheet sheet = workBook.getSheet(sheetName);
/* Get number of rows */
int lastRow = sheet.getLastRowNum();
int firstRow = sheet.getFirstRowNum();
int numberOfRows = lastRow - firstRow;
/*
* Get test_Id column number.
*/
outerloop: for (int row = 0; row < numberOfRows; row++) {
numberOfColumns = sheet.getRow(row).getLastCellNum();
for (int cellNumber = 0; cellNumber < numberOfColumns; cellNumber++) {
cell = sheet.getRow(row).getCell(cellNumber);
cell.setCellType(Cell.CELL_TYPE_STRING);
if (sheet.getRow(row).getCell(cellNumber).getStringCellValue().equalsIgnoreCase("test_ID")) {
testIdColumn = sheet.getRow(row).getCell(cellNumber).getColumnIndex();
break outerloop;
}
}
}
/*
* Search for the test id value.
*/
outerloop: for (int i = 0; i <= numberOfRows; i++) {
cell = sheet.getRow(i).getCell(testIdColumn);
cell.setCellType(Cell.CELL_TYPE_STRING);
if (testID.equals(sheet.getRow(i).getCell(testIdColumn).getStringCellValue())) {
for (int j = 0; j < numberOfColumns; j++) {
XSSFCell key = sheet.getRow(testIdColumn).getCell(j);
XSSFCell value = sheet.getRow(i).getCell(j);
key.setCellType(Cell.CELL_TYPE_STRING);
if (value == null) {
// Not capturing blank cells.
} else if (value.getCellType() == XSSFCell.CELL_TYPE_BLANK) {
// Not capturing blank cells.
} else {
value.setCellType(Cell.CELL_TYPE_STRING);
String fieldName = sheet.getRow(testIdColumn).getCell(j).getStringCellValue().trim();
String fieldValue = sheet.getRow(i).getCell(j).getStringCellValue().trim();
fieldsAndValues.put(fieldName, fieldValue);
}
}
System.out.println("Fields and values: " + Arrays.toString(fieldsAndValues.entrySet().toArray()));
break outerloop;
}
}
} catch (Exception e) {
System.out.println("Exception occurred at getting the sheet: " + e);
}
/* Return the hash map */
return fieldsAndValues;
}
}
步骤定义:
ExcelReader excelReader;
@Given("get data from datasheet with \"(.*)\" and \"(.*)\"$")
public void get_data_from_datasheet(String testId, String sheetName) {
excelReader = new ExcelReader(testId, sheetName);
}
@And("login to the application")
public void loginApplication(){
driver.findElement(By.xpath("element")).sendKeys(excelReader.fieldsAndValues.get("UserName"));
driver.findElement(By.xpath("element")).sendKeys(excelReader.fieldsAndValues.get("PassWord"));
driver.findElement(By.xpath("element")).click();
}
We cannot directly integrete Excel file data to Gerkin file
。
相反 在步骤文件中编写单独的方法以从 excel 获取数据并执行您的案例。
我使用下面的代码获取数据——普通代码
public static JSONArray Read_Excel_Data(String filename, String sheetname) throws IOException {
FileInputStream fileIn = null;
Workbook workbookout = null;
JSONArray totalData = new JSONArray();
try{
log.info("Filename and Sheet name : "+filename+", "+ sheetname );
fileIn = new FileInputStream(new File(filename));
workbookout = new XSSFWorkbook(fileIn);
Sheet sh = workbookout.getSheet(sheetname);
int totRows = sh.getLastRowNum();
Row hearderRow = sh.getRow(0);
int totCols = hearderRow.getLastCellNum();
log.info("Total [ Rows and Colums ] : [ "+totRows+" and "+ totCols +" ] ");
for(int i=1; i <= totRows; i++ ){
log.info("Progressing row : "+i);
Row tempRw = sh.getRow(i);
JSONObject jo = new JSONObject();
for(int j=0; j<totCols; j++ ){
Cell tempCell = tempRw.getCell(j);
Cell HeaderCell = hearderRow.getCell(j);
try{
jo.put(HeaderCell.getStringCellValue(), tempCell.getStringCellValue());
log.info("Value in "+i+" / "+j+" :::::::::::: > "+tempCell.getStringCellValue() );
}catch (NullPointerException npe){
log.warn(":::::::::::: > Null Value in [ "+i+" / "+j+" ] ");
}
}
totalData.add(jo);
}
workbookout.close();
fileIn.close();
System.out.println("Total data :::::::: "+totalData.toJSONString());
}catch(Exception e){
e.printStackTrace();
log.error("Error Occured !!"+e.toString());
workbookout.close();
fileIn.close();
}
return totalData;
}
需要根据 Excel 文件中的给定“键”获取“值” 我有 excel 个文件 文件名测试 xlsx 和 sheet 姓名 sheet1
And sheet 包含以下键值对 and。 JIRA 票证是唯一的。
Test case description | testdata key | Testdatavalue | testdata2 key | Testdata2 Value | testdata3 key | Testdata3 value |
---|---|---|---|---|---|---|
Sampiletest description1 | Testcase-jira-1 | user1id | Harshadh | Password | 123ggg | |
Sampiletest2 discription | Testcase-jira-2 | user2 | Ramu | Password123 | 333ggg | |
Sampiletest3 discription | Test case jira-3 | user3 | latha | Password556 | 73hhh |
最多 N 行
这里,我需要使用Java Selenium Cucumber 以如下方式获取数据。我将使用上面的测试数据通过 BDD 方式传入 Cucumber step definition
class 文件。
如何获取definition
文件中的数据
1)如果从当前行传递键值,我们如何获取值的值,为 webSeleinum 元素提供测试输入
示例第 4 行数据
Sampiletest3 discription|Test case jira-3| user3|latha|Password556|73hhh
.....
如果我调用“user3”应该return“Password556” 我需要获取值的任何行都以同样的方式。 请指导我
我建议将场景的所有数据放入 Gherkin 文档中,但您可能有从 excel 中提取数据的有效用例。但是,根据我的经验,这类要求很少见。不推荐的原因是,您的 BDD 功能文件是您的要求,应该包含正确级别的信息来记录系统的预期行为。如果您的数据来自 excel,那么它只会让需求阅读变得更加困难,并且难以维护。
也就是说,如果您有充分的理由将这些数据存储在 excel 中,您可以使用 NoCodeBDD 轻松实现。您所要做的就是映射列名称并上传 excel,其余的由该工具处理。请检查此 .gif 以了解它是如何完成的。 https://nocodebdd.live/examples-using-excel
免责声明:我是NoCodeBDD的创始人。
如果您使用的是 Junit5,这里有一个如何完成的示例 https://newbedev.com/data-driven-testing-in-cucumber-using-excel-files-code-example
您可以使用外部数据源来提供使用 qaf-cucumber 的示例。它将能够提供数据文件,用于提供来自外部数据源的示例,包括 csv
、json
、xml
、excel
文件或数据库查询。
您可以试试下面的代码。
特征文件:
- 在示例中,您可以提供行号和 sheet 名称以使用数据进行迭代。
Scenario Outline: Login to the application with multiple users.
Given get data from datasheet with "<test_id>" and "<sheetName>"
And login to the application
Examples:
| test_id | sheetName |
| 1 | Login |
| 2 | Login |
Excel数据:
从excel读取数据并将其存储在hashmap
:
- 创建一个class来读取数据(例子:ExcelReader)
- 使用
org.apache.poi.ss.usermodel
和org.apache.poi.xssf.usermodel
导入
public class ExcelReader {
private File file;
private FileInputStream inputStream;
private String testID;
private String sheetName;
private int testIdColumn;
private int numberOfColumns;
private XSSFCell cell;
public HashMap<String, String> fieldsAndValues;
public ExcelReader(String testId, String sheetName) {
file = new File(System.getProperty("user.dir") + "Excel location path");
try {
inputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
System.out.println("File not found at given location: " + e);
}
this.testID = testId;
this.sheetName = sheetName;
this.readExcelAndCreateHashMapForData();
}
public HashMap<String, String> readExcelAndCreateHashMapForData() {
try {
fieldsAndValues = new HashMap<String, String>();
XSSFWorkbook workBook = new XSSFWorkbook(inputStream);
XSSFSheet sheet = workBook.getSheet(sheetName);
/* Get number of rows */
int lastRow = sheet.getLastRowNum();
int firstRow = sheet.getFirstRowNum();
int numberOfRows = lastRow - firstRow;
/*
* Get test_Id column number.
*/
outerloop: for (int row = 0; row < numberOfRows; row++) {
numberOfColumns = sheet.getRow(row).getLastCellNum();
for (int cellNumber = 0; cellNumber < numberOfColumns; cellNumber++) {
cell = sheet.getRow(row).getCell(cellNumber);
cell.setCellType(Cell.CELL_TYPE_STRING);
if (sheet.getRow(row).getCell(cellNumber).getStringCellValue().equalsIgnoreCase("test_ID")) {
testIdColumn = sheet.getRow(row).getCell(cellNumber).getColumnIndex();
break outerloop;
}
}
}
/*
* Search for the test id value.
*/
outerloop: for (int i = 0; i <= numberOfRows; i++) {
cell = sheet.getRow(i).getCell(testIdColumn);
cell.setCellType(Cell.CELL_TYPE_STRING);
if (testID.equals(sheet.getRow(i).getCell(testIdColumn).getStringCellValue())) {
for (int j = 0; j < numberOfColumns; j++) {
XSSFCell key = sheet.getRow(testIdColumn).getCell(j);
XSSFCell value = sheet.getRow(i).getCell(j);
key.setCellType(Cell.CELL_TYPE_STRING);
if (value == null) {
// Not capturing blank cells.
} else if (value.getCellType() == XSSFCell.CELL_TYPE_BLANK) {
// Not capturing blank cells.
} else {
value.setCellType(Cell.CELL_TYPE_STRING);
String fieldName = sheet.getRow(testIdColumn).getCell(j).getStringCellValue().trim();
String fieldValue = sheet.getRow(i).getCell(j).getStringCellValue().trim();
fieldsAndValues.put(fieldName, fieldValue);
}
}
System.out.println("Fields and values: " + Arrays.toString(fieldsAndValues.entrySet().toArray()));
break outerloop;
}
}
} catch (Exception e) {
System.out.println("Exception occurred at getting the sheet: " + e);
}
/* Return the hash map */
return fieldsAndValues;
}
}
步骤定义:
ExcelReader excelReader;
@Given("get data from datasheet with \"(.*)\" and \"(.*)\"$")
public void get_data_from_datasheet(String testId, String sheetName) {
excelReader = new ExcelReader(testId, sheetName);
}
@And("login to the application")
public void loginApplication(){
driver.findElement(By.xpath("element")).sendKeys(excelReader.fieldsAndValues.get("UserName"));
driver.findElement(By.xpath("element")).sendKeys(excelReader.fieldsAndValues.get("PassWord"));
driver.findElement(By.xpath("element")).click();
}
We cannot directly integrete Excel file data to Gerkin file
。 相反 在步骤文件中编写单独的方法以从 excel 获取数据并执行您的案例。
我使用下面的代码获取数据——普通代码
public static JSONArray Read_Excel_Data(String filename, String sheetname) throws IOException {
FileInputStream fileIn = null;
Workbook workbookout = null;
JSONArray totalData = new JSONArray();
try{
log.info("Filename and Sheet name : "+filename+", "+ sheetname );
fileIn = new FileInputStream(new File(filename));
workbookout = new XSSFWorkbook(fileIn);
Sheet sh = workbookout.getSheet(sheetname);
int totRows = sh.getLastRowNum();
Row hearderRow = sh.getRow(0);
int totCols = hearderRow.getLastCellNum();
log.info("Total [ Rows and Colums ] : [ "+totRows+" and "+ totCols +" ] ");
for(int i=1; i <= totRows; i++ ){
log.info("Progressing row : "+i);
Row tempRw = sh.getRow(i);
JSONObject jo = new JSONObject();
for(int j=0; j<totCols; j++ ){
Cell tempCell = tempRw.getCell(j);
Cell HeaderCell = hearderRow.getCell(j);
try{
jo.put(HeaderCell.getStringCellValue(), tempCell.getStringCellValue());
log.info("Value in "+i+" / "+j+" :::::::::::: > "+tempCell.getStringCellValue() );
}catch (NullPointerException npe){
log.warn(":::::::::::: > Null Value in [ "+i+" / "+j+" ] ");
}
}
totalData.add(jo);
}
workbookout.close();
fileIn.close();
System.out.println("Total data :::::::: "+totalData.toJSONString());
}catch(Exception e){
e.printStackTrace();
log.error("Error Occured !!"+e.toString());
workbookout.close();
fileIn.close();
}
return totalData;
}