您好,我正在尝试用 Java 驱动数据。我读取 excel 并将值传递给变量“test2”和“test 3”以进行测试。此外,我还需要一个从 testing.xml 发送的参数“test1”。现在执行下面的测试会抛出一个错误
org.testng.TestNGException: 数据提供者试图传递 2 个参数,但 com.xxxxx.xxx 方法需要 3 个参数,并且 TestNG 无法注入(inject)合适的对象
那么如何将参数和数据提供者传递给同一个方法。谢谢
/* testdataprovider will return the test2 and test3 parameter value */
@Parameters("test1")
@Test(dataProvider = "testdataprovider")
public void testMethod(String test1, String test2, String test3){}
最佳答案
我可能会大错特错(如果我错了,我相信其他人会给你更好的解决方案);但我不认为你可以使用 testNG Guruswamy 实现你所追求的目标。 我刚刚使用此 dataProvider 测试了您的尝试
@DataProvider(name = "login8users")
public Object[][] login8usersForStackOverflow() {
return new Object[][] {
{ "user1@gmail.com", "pass" },
{ "user2@gmail.com", "pass"},
{ "user3@gmail.com", "pass"},
{ "user4@gmail.com", "pass"},
{ "user5@gmail.com", "pass"},
{ "user6@gmail.com", "pass"},
{ "user7@gmail.com", "pass"},
{ "user8@gmail.com", "pass"},
};
}
并从 XML 文件传递一个名为 browser 的参数。我注意到当您在同一个@Test 注释下使用 dataProvider 和 Parameters 时;您是否会收到上面向我们展示的错误,或者 XMLparameters 将被完全忽略(似乎 dataProvider 取代了它们)。 然后是测试方法:
@Test(dataProvider="login8users")
@Parameters({"browser"})
public void login8(String dataProvider1, String dataProvider2) {
System.out.println("Email from data provider is..: "+dataProvider1);
System.out.println("Pass from data provider is..: "+dataProvider2);
}
这是输出:
[TestNG] Running:
C:\projects\test\currentTest.xml
Email from data provider is..: user1@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user2@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user3@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user4@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user5@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user6@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user7@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user8@gmail.com
Pass from data provider is..: pass
===============================================
Regression
Total tests run: 8, Failures: 0, Skips: 0
===============================================
因此您需要寻找替代解决方案。其中之一可能是提前加载参数,(甚至可能在@BeforeClass 中)在测试中将参数作为全局变量传递,以便您可以访问它。所以像这样的解决方案:
public static String globalVarScope;
@BeforeClass
@Parameters({"xmlParam"})
public void initialSetup(String xmlParam) {
System.out.println("Parameter from XML is..: "+xmlParam);
globalVarScope= xmlParam;
}
@Test
public void useMeAnywhere() {
System.out.println("Hey, I passed the param earlier and I can use it anywhere now :) ..: "+globalVarScope);
}
@Test(dataProvider="login8users")
@Parameters({"browser"})
public void login8(String dataProvider1, String dataProvider2) {
System.out.println("Email from data provider is..: "+dataProvider1);
System.out.println("Pass from data provider is..: "+dataProvider2);
}
希望现在您可以达到您想要的结果,如果您遇到困难,请告诉我。这是单独运行参数后的最终输出:
[TestNG] Running:
C:\projects\test\currentTest.xml
Browser is..: ***chrome***
Email from data provider is..: user1@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user2@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user3@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user4@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user5@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user6@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user7@gmail.com
Pass from data provider is..: pass
Email from data provider is..: user8@gmail.com
Pass from data provider is..: pass
===============================================
Regression
Total tests run: 9, Failures: 0, Skips: 0
===============================================
祝你好运!
关于java - 我们如何将参数和数据提供者传递给 Testng 中的相同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41802922/