2

我正在使用 java 创建测试自动化框架,但我无法读取黄瓜中的 excel 文件。

有什么方法可以使用 @DataProvider 功能和 testNG?

我不想使用功能文件的数据表。

4

4 回答 4

1

如果您使用 CucumberJVM,我认为您可以在没有重大黑客攻击的情况下使用 TestNG 数据提供程序。或者至少这不是做事的“黄瓜方式”。Data Table 是 Cucumber 等效的 TestNG Data Provider:

https://cucumber.io/docs/reference#data-tables

这就是您在 Cucumber 中参数化测试的方式。我并不是说您正在寻找的解决方案无法实施,我是说您很可能在寻找错误的东西。CucumberJVM 在内部使用 DataProviders,以这种方式处理特性:

https://github.com/cucumber/cucumber-jvm/blob/master/testng/src/main/java/cucumber/api/testng/AbstractTestNGCucumberTests.java

于 2015-08-11T19:18:27.440 回答
0

如果它帮助别人:

在我的情况下,这非常有用,因为对于每个场景步骤,我必须加载 Excel 数据(来自具有相同组 ID 的多行的数据)才能执行进一步的验证。像这样,Cucumber 功能文件更简洁,而 Excel 包含所有细节。

于 2019-11-14T13:16:41.850 回答
0

ExcelBDD Java版可以优雅地解决这个问题。代码示例

static Stream<Map<String, String>> provideExampleList() throws IOException {
    String filePath = TestWizard.getExcelBDDStartPath("excelbdd-test")
            + "excelbdd-test\\src\\test\\resources\\excel.xlsx";
    return Behavior.getExampleStream(filePath,"Expected1","Scenario1");
}

@ParameterizedTest(name = "Test{index}:{0}")
@MethodSource("provideExampleList")
void testgetExampleWithExpected(Map<String, String> parameterMap) {
    assertNotNull(parameterMap.get("Header"));
    System.out.println(String.format("=======Header: %s=======", parameterMap.get("Header")));
    for (Map.Entry<String, String> param : parameterMap.entrySet()) {
        System.out.println(String.format("%s --- %s", param.getKey(), param.getValue()));
    }
}

更多详细信息参见 ExcelBDD Guideline By Java Example

于 2021-07-10T04:15:15.643 回答
-2

这是如何从 excel 中读取 TestData 的示例

public class Framework {
static String TestDataPath = System.getProperty("user.dir")
			+ "\\ExcelFiles\\TestData.xlsx";
public static HashMap<String, HashMap<String, String>> hm1 = new HashMap<>();
static String s3;
public static void ReadTestData() throws IOException {

		FileInputStream file = new FileInputStream(TestDataPath);

		XSSFWorkbook workbook = new XSSFWorkbook(file);
		XSSFSheet sheet = workbook.getSheet("Sheet1");
		Row HeaderRow = sheet.getRow(0);
		for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {
			Row currentRow = sheet.getRow(i);
			HashMap<String, String> currentHash = new HashMap<String, String>();
			for (int j = 0; j < currentRow.getPhysicalNumberOfCells(); j++) {

				Cell currentCell1 = currentRow.getCell(0);
				switch (currentCell1.getCellType()) {
				case Cell.CELL_TYPE_STRING:
					s3 = currentCell1.getStringCellValue();
					System.out.println(s3);
					break;
				case Cell.CELL_TYPE_NUMERIC:
					s3 = String.valueOf(currentCell1.getNumericCellValue());
					System.out.println(s3);
					break;
				}

				Cell currentCell = currentRow.getCell(j);
				switch (currentCell.getCellType()) {
				case Cell.CELL_TYPE_STRING:
					currentHash.put(HeaderRow.getCell(j).getStringCellValue(),
							currentCell.getStringCellValue());
					break;
				case Cell.CELL_TYPE_NUMERIC:
					currentHash.put(HeaderRow.getCell(j).getStringCellValue(),
							String.valueOf(currentCell.getNumericCellValue()));
					break;
				}

			}
			
			hm1.put(s3, currentHash);
		}

这是模型黄瓜文件和测试数据。

Scenario Outline: Successful Login with Valid Credentials
	Given User is on Home Page
	When User Navigate to LogIn Page
	And User enters mandatory details of "<TextCase>" 
	Then Message displayed Login Successfully
	Examples:
    |TextCase| 
    |Case1   |
    |Case2   |


[Test data img Link][1]


  [1]: https://i.stack.imgur.com/IjOap.png

这是模型步骤定义文件

@When("^User enters mandatory details of \"([^\"]*)\"$")
	public void user_enters_mandatory_details_of(String arg1) throws Throwable {
	    // Write code here that turns the phrase above into concrete actions

		driver.FindElement("UserName").sendKeys(Framework.hm1.get(arg1).get("UserName"));
		
		Framework.FindElement("Password").sendKeys(Framework.hm1.get(arg1).get("Password"));
		
	}

在黄瓜中按照以上三个步骤您将能够读取测试数据。

于 2016-12-11T10:28:39.243 回答