Selenium 中的数据提供者与 TestNG 不匹配

Posted

技术标签:

【中文标题】Selenium 中的数据提供者与 TestNG 不匹配【英文标题】:Data provider mismatch in Selenium with TestNG 【发布时间】:2018-02-10 10:29:39 【问题描述】:

我正在用 selenium 编写下面的代码,并显示下面的错误,请告诉我问题出在哪里。

导入 org.testng.annotations.DataProvider; 导入 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([Parameterindex=0, type=java.lang.String,declaredAnnotations=[],Parameterindex=1, type=java.lang.String,declaredAnnotations=[],Parameterindex=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) 在 org.testng.internal.Invoker.injectParameters(Invoker.java:1293) 在 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) 在 org.testng.TestRunner.run(TestRunner.java:602) 在 org.testng.SuiteRunner.runTest(SuiteRunner.java:380) 在 org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375) 在 org.testng.SuiteRunner.privateRun(SuiteRunner.java:340) 在 org.testng.SuiteRunner.run(SuiteRunner.java:289) 在 org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 在 org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 在 org.testng.TestNG.runSuitesSequentially(TestNG.java:1301) 在 org.testng.TestNG.runSuitesLocally(TestNG.java:1226) 在 org.testng.TestNG.runSuites(TestNG.java:1144) 在 org.testng.TestNG.run(TestNG.java:1115) 在 org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132) 在 org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230) 在 org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)

【问题讨论】:

【参考方案1】:

我看到的唯一问题是,您正在从 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);


【讨论】:

你的建议解决了我的问题,代码现在可以工作了,谢谢 Gaurang :-)【参考方案2】:

我知道已经为这个问题提供了解决方案,但是没有明确讨论为什么会发生异常以及异常意味着什么。异常消息很长,甚至可能有点混乱。让我们格式化异常消息并仔细阅读。

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

Data provider mismatch Method: testData([
Parameterindex=0, type=java.lang.String, declaredAnnotations=[], 
Parameterindex=1, type=java.lang.String, declaredAnnotations=[], 
Parameterindex=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, String, Integer),但是数据提供者提供的参数是(String, String, String)。

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

【讨论】:

以上是关于Selenium 中的数据提供者与 TestNG 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Selenium Java(maven 项目):TestNG 结果与 ReportNG 不同

如何从 @AfterMethod 中的 TestNG/Selenium 获取测试结果状态?

Selenium2(java)TestNG的使用 七

我们可以将TestNG与Selenium WebDriver和Cucumber一起使用吗? [关闭]

selenium+testng+java+poi进行excel的数据参数化

如何将 Selenium Testng (java) 与 Testrail 测试用例集成