Selenium中的数据提供程序与TestNG

时间:2017-09-01 11:03:02

标签: java excel selenium apache-poi testng

我在selenium中写下面的代码,下面显示错误,请告诉我问题在哪里。

import org.testng.annotations.DataProvider; import org.testng.annotations.Test;

public class testngexcel {

    public static ExcelReader excel = null;
    @Test(dataProvider = "newdata")
    public void testData(String username, String password, Integer age) {
        System.out.println(username + " - " + password + " - " + age);
    }

    @DataProvider(name = "newdata")
    public static Object[][] getData() {

            if (excel == null) {
                excel = new ExcelReader("C:\\Users\\Anjali.Nautiyal\\Desktop\\selenium\\testngdata.xlsx");
            }

            String sheetName = "login";
            int rows = excel.getRowCount(sheetName);
            int cols = excel.getColumnCount(sheetName);

            Object[][] data = new Object[rows - 1][cols];

            for (int rowNum = 2; rowNum <= rows; rowNum++) {
                for (int colNum = 0; colNum < cols; colNum++) {
                    data[rowNum - 2][colNum] = excel.getCellData(sheetName, colNum, rowNum);
                }
            }
            return data;

错误:

  

失败:testData org.testng.internal.reflect.MethodMatcherException:   数据提供程序不匹配方法:testData([Parameter {index = 0,   type = java.lang.String,declaredAnnotations = []},参数{index = 1,   type = java.lang.String,declaredAnnotations = []},参数{index = 2,   type = java.lang.Integer,declaredAnnotations = []}])参数:   [(java.lang.String中)ANJALI,(java.lang.String中)PA,(java.lang.String中)25.0]     在   org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:49)     at org.testng.internal.Invoker.injectParameters(Invoker.java:1293)     at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1187)     在   org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)     在   org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)     在org.testng.TestRunner.privateRun(TestRunner.java:744)at   org.testng.TestRunner.run(TestRunner.java:602)at   org.testng.SuiteRunner.runTest(SuiteRunner.java:380)at   org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)at at   org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)at at   org.testng.SuiteRunner.run(SuiteRunner.java:289)at   org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)at   org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)at   org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)at at   org.testng.TestNG.runSuitesLocally(TestNG.java:1226)at at   org.testng.TestNG.runSuites(TestNG.java:1144)at   org.testng.TestNG.run(TestNG.java:1115)at   org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)     at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)     在org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)

2 个答案:

答案 0 :(得分:2)

我看到的唯一问题是,您正在阅读excel,因此String可能会显示所有值,除非您将其转换为Integer。但是,在测试中,您希望第三个参数ageInteger

将类型更改为String可解决问题

@Test(dataProvider = "newdata")
public void testData(String username, String password, String age) {
        System.out.println(username + " - " + password + " - " + age);
}

以下代码会引发相同的错误。

@DataProvider(name = "newdata")
public static Object[][] getData() {
    return new Object[][]{
            {"20"},
            {"30"}
    };
}

@Test(dataProvider = "newdata")
public void testData(Integer age) {

    System.out.println(age);

}

答案 1 :(得分:0)

我知道已经为该问题提供了解决方案,但是没有明确讨论异常发生的原因以及异常的含义。异常消息很长,甚至可能有些混乱。让我们格式化异常消息并仔细阅读。

FAILED: testData org.testng.internal.reflect.MethodMatcherException: 

Data provider mismatch Method: testData([
Parameter{index=0, type=java.lang.String, declaredAnnotations=[]}, 
Parameter{index=1, type=java.lang.String, declaredAnnotations=[]}, 
Parameter{index=2, type=java.lang.Integer, declaredAnnotations=[]}]) 

Arguments: [
(java.lang.String)user123,
(java.lang.String)password123,
(java.lang.String)25.0] 
at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:49)...etc.

当数据提供者未“匹配”其所映射到的测试方法时,将发生MethodMatcherException异常。在这种情况下,会发生不匹配,因为数据提供者提供的参数与测试方法的参数不匹配。

异常消息基本上说测试方法“ testData”需要参数(字符串,字符串,整数),但是数据提供者提供的参数是(字符串,字符串,字符串)。

因此,问题出在数据提供者上,因为它为String赋予了Integer年龄。数据提供者使用一些库来读取电子表格中的单元格。这意味着库代码将单元格内容作为字符串返回。因此,您需要将单元格数据转换为正确的Java类型,例如Integer。