7.0.0-beta1
我有一个包含 DataProvider 的类,其中包含 5 个数据集,包括浏览器名称、版本和平台,您可以在此处看到:
public class DataProviderManager {
@DataProvider(parallel = true)
public static Object[][] defaultWebDataProvider() {
return new Object[][] {
new Object[]{"chrome", "70", "Windows 10"},
new Object[]{"internet explorer", "11", "Windows 10"},
new Object[]{"safari", "12.0", "Mac 10.13"},
new Object[]{"chrome", "70", "Mac 10.13"},
new Object[]{"firefox", "63", "Mac 10.13"}
};
}
}
在我的测试类中,我使用 Factory 传递数据:
public class MSGWebExampleTest extends BaseTest {
// Declare page objects
private MSGHome msgHome;
// Declare test data
@Factory(dataProvider = StaticProps.DEFAULT_WEB_DATA_PROVIDER, dataProviderClass = DataProviderManager.class)
public MSGWebExampleTest(String browser, String browserVersion, String platform) {
super.setRunParams(browser, browserVersion, platform);
}
@BeforeMethod(alwaysRun = true)
public void setupTest() {
msgHome = new MSGHome();
}
@Features({GroupProps.WEB})
@Test(groups = {GroupProps.DEBUG})
@Parameters({ParamProps.WEB, ParamProps.MOBILE_WEB})
public void openSiteTest() {
new WebInteract(null,null).pause(1000).openUrl(URLBuilder.buildUrl());
}
}
测试.xml:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Test Engineering Core Suite" parallel="methods" thread-count="2" data-provider-thread-count="4">
如果我设置 thread-count =2 和 data-provider-thread-count =4 并且 parallel=true 我的测试应该并行运行 8 次。
无论我尝试设置多少个线程,测试都会按顺序运行,就像忽略 parallel=true 一样。 我尝试了无数次尝试使用上面的 testing.xml 来并行运行,方法是从命令行传递 -Dthreadcount=2 -Ddataproviderthreacount=4,甚至在surefire插件的配置标签中设置这些值,但没有任何效果。
请分享显示问题的测试用例(尽可能小)
@VinceBarresi - 我不太确定你是如何说 TestNG 正在按顺序运行测试的。
我改变了你的测试类来打印出线程 id,这是它的样子
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
public class MSGWebExampleTest {
private String browser, browserVersion, platform;
@Factory(dataProvider = "dp")
public MSGWebExampleTest(String browser, String browserVersion, String platform) {
this.browser = browser;
this.browserVersion = browserVersion;
this.platform = platform;
}
<strong i="8">@Test</strong>
public void openSiteTest() {
System.err.println("Running " + this + " on thread [" + Thread.currentThread().getId() + "]");
}
<strong i="9">@Override</strong>
public String toString() {
return String.format("[%s, %s, %s]", browser, browserVersion, platform);
}
@DataProvider(parallel = true, name = "dp")
public static Object[][] defaultWebDataProvider() {
return new Object[][]{
new Object[]{"chrome", "70", "Windows 10"},
new Object[]{"internet explorer", "11", "Windows 10"},
new Object[]{"safari", "12.0", "Mac 10.13"},
new Object[]{"chrome", "70", "Mac 10.13"},
new Object[]{"firefox", "63", "Mac 10.13"}
};
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Test Engineering Core Suite"
parallel="methods"
data-provider-thread-count="4"
thread-count="2"
verbose="2">
<test name="Test Engineering Core_test">
<classes>
<class name="com.rationaleemotions.github.issue1951.MSGWebExampleTest"/>
</classes>
</test>
</suite>
输出
...
... TestNG 7.0.0-beta1 by Cédric Beust ([email protected])
...
Running [chrome, 70, Mac 10.13] on thread [11]
Running [chrome, 70, Windows 10] on thread [12]
Running [internet explorer, 11, Windows 10] on thread [12]
Running [firefox, 63, Mac 10.13] on thread [11]
Running [safari, 12.0, Mac 10.13] on thread [12]
PASSED: openSiteTest on [chrome, 70, Mac 10.13]
PASSED: openSiteTest on [chrome, 70, Windows 10]
PASSED: openSiteTest on [internet explorer, 11, Windows 10]
PASSED: openSiteTest on [firefox, 63, Mac 10.13]
PASSED: openSiteTest on [safari, 12.0, Mac 10.13]
===============================================
Test Engineering Core_test
Tests run: 5, Failures: 0, Skips: 0
===============================================
===============================================
Test Engineering Core Suite
Total tests run: 5, Passes: 5, Failures: 0, Skips: 0
===============================================
从上面的输出中可以看出,线程 id 是不同的(两个线程是特定的,因为我们的线程数是 2)
您的示例中的数据提供者与工厂方法相关联,而不是与@Test
方法相关联。 所以它不会在我正在执行的线程数上发挥任何作用。
仅当以下情况发生时——
@Test
方法相结合@DataProvider
的parallel属性设置为true
<suite>
(或) <test>
标签中的属性parallel
设置为methods
data-provider-thread-count
value 设置为大于 1 的值TestNG 将启用并行性,并且由数据提供者提供支持的@Test
方法的数量将等于通过属性data-provider-thread-count.
设置的线程数
注意:套件 xml 文件中的thread-count
属性仅适用data-provider-thread-count
属性仅适用
请让我知道该解释是否有意义以及是否可以关闭此问题。
@krmahadevan感谢您的详细回复。 当我有机会时,我想亲自测试一下。 我有几个问题,
1:数据提供者(在这种情况下 - “dp)是否必须与我们将数据提供者传递给的@Test位于同一类中,以便仍然通过 data-provider-thread-count 和 parallel = true 实现并行性?
2:您是否在套件级别执行测试? 如果是这样,这在并行性方面甚至重要吗? 例如,如果我使用 mvn test -Dgroups=DEBUG 通过surefire 启动我的调试组测试,我是否需要通过此命令中的参数传递数据提供者线程数?
1:数据提供者(在这种情况下 - “dp)是否必须与我们将数据提供者传递给的
@Test
位于同一类中,以便仍然通过数据提供者线程计数实现并行性和平行=真的?
没有必要。 数据提供者所在的位置并不重要。
2:您是否在套件级别执行测试? 如果是这样,这在并行性方面甚至重要吗? 例如,如果我使用 mvn test -Dgroups=DEBUG 通过surefire 启动我的调试组测试,我是否需要通过此命令中的参数传递数据提供者线程数?
是的,我确实在套件级别执行了测试。 应该没关系。 作为
只要数据提供者线程计数在套件文件中可用
(如果未提供,我相信默认值为 10),它应该可以工作
无缝地。
@krmahadevan所以我今天早上有机会使用您建议的更改进行测试并进行一些观察。
...
... TestNG 7.0.0-beta1 by Cédric Beust ([email protected])
...
org.testng.internal.reflect.MethodMatcherException:
Data provider mismatch
Method: openSiteTest([])
Arguments: [(java.lang.String) chrome,(java.lang.String) 70,(java.lang.String) Windows 10]
at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:40)
at org.testng.internal.Parameters.injectParameters(Parameters.java:936)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1057)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
org.testng.internal.reflect.MethodMatcherException:
Data provider mismatch
Method: openSiteTest([])
Arguments: [(java.lang.String) chrome,(java.lang.String) 70,(java.lang.String) Windows 10]
at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:40)
at org.testng.internal.Parameters.injectParameters(Parameters.java:936)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1057)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
org.testng.internal.reflect.MethodMatcherException:
Data provider mismatch
Method: openSiteTest([])
Arguments: [(java.lang.String) chrome,(java.lang.String) 70,(java.lang.String) Windows 10]
at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:40)
at org.testng.internal.Parameters.injectParameters(Parameters.java:936)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1057)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
org.testng.internal.reflect.MethodMatcherException:
Data provider mismatch
Method: openSiteTest([])
Arguments: [(java.lang.String) chrome,(java.lang.String) 70,(java.lang.String) Windows 10]
at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:40)
at org.testng.internal.Parameters.injectParameters(Parameters.java:936)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1057)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
org.testng.internal.reflect.MethodMatcherException:
Data provider mismatch
Method: openSiteTest([])
Arguments: [(java.lang.String) chrome,(java.lang.String) 70,(java.lang.String) Windows 10]
at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:40)
at org.testng.internal.Parameters.injectParameters(Parameters.java:936)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1057)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Test ignored.
===============================================
Test Engineering Core Suite
Total tests run: 5, Passes: 0, Failures: 5, Skips: 0
===============================================
Process finished with exit code 0
...
... TestNG 7.0.0-beta1 by Cédric Beust ([email protected])
...
[Utils] [ERROR] [Error] org.testng.TestNGException:
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="7">@DataProvider</strong> named : defaultWebDataProvider
at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
[Utils] [ERROR] [Error] org.testng.TestNGException:
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="8">@DataProvider</strong> named : defaultWebDataProvider
at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
[Utils] [ERROR] [Error] org.testng.TestNGException:
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="9">@DataProvider</strong> named : defaultWebDataProvider
at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
[Utils] [ERROR] [Error] org.testng.TestNGException:
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="10">@DataProvider</strong> named : defaultWebDataProvider
at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
[Utils] [ERROR] [Error] org.testng.TestNGException:
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="11">@DataProvider</strong> named : defaultWebDataProvider
at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
org.testng.TestNGException:
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="12">@DataProvider</strong> named : defaultWebDataProvider
at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
org.testng.TestNGException:
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="13">@DataProvider</strong> named : defaultWebDataProvider
at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
org.testng.TestNGException:
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="14">@DataProvider</strong> named : defaultWebDataProvider
at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
org.testng.TestNGException:
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="15">@DataProvider</strong> named : defaultWebDataProvider
at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
org.testng.TestNGException:
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="16">@DataProvider</strong> named : defaultWebDataProvider
at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Test ignored.
===============================================
Test Engineering Core Suite
Total tests run: 5, Passes: 0, Failures: 5, Skips: 0
===============================================
对此有何想法?
你能分享你用来触发错误的测试代码吗?
我使用的是您在上面粘贴的确切 testing.xml 文件(显然该类指向我包中的测试类)。 这是我的 DataProviderManager.java
public class DataProviderManager {
@DataProvider(parallel = true, name = "defaultWebDataProvider")
public static Object[][] defaultWebDataProvider() {
return new Object[][]{
new Object[]{"chrome", "70", "Windows 10"},
new Object[]{"internet explorer", "11", "Windows 10"},
new Object[]{"safari", "12.0", "Mac 10.13"},
new Object[]{"chrome", "70", "Mac 10.13"},
new Object[]{"firefox", "63", "Mac 10.13"}
};
}
}
这是我的测试课
public class MSGWebExampleTest extends BaseTest {
// Declare page objects
private MSGHome msgHome;
@Factory(dataProvider = StaticProps.DEFAULT_WEB_DATA_PROVIDER, dataProviderClass = DataProviderManager.class)
// @Factory(dataProvider = StaticProps.DEFAULT_WEB_DATA_PROVIDER)
public MSGWebExampleTest(String browser, String browserVersion, String platform) {
super.setRunParams(browser, browserVersion, platform);
}
@BeforeMethod(alwaysRun = true)
public void setupTest() {
msgHome = new MSGHome();
}
@TestCaseId("")
@Features({GroupProps.WEB})
@Test(groups = {GroupProps.DEBUG}, dataProvider = StaticProps.DEFAULT_WEB_DATA_PROVIDER)
@Parameters({ParamProps.WEB, ParamProps.MOBILE_WEB})
public void openSiteTest() {
Logger.logMessage(Thread.currentThread().getId());
new WebInteract(null, null).pause(1000).openUrl(URLBuilder.buildUrl());
}
// @DataProvider(parallel = true, name = StaticProps.DEFAULT_WEB_DATA_PROVIDER)
// public static Object[][] defaultWebDataProvider() {
// return new Object[][] {
// new Object[]{"chrome", "70", "Windows 10"},
// new Object[]{"internet explorer", "11", "Windows 10"},
// new Object[]{"safari", "12.0", "Mac 10.13"},
// new Object[]{"chrome", "70", "Mac 10.13"},
// new Object[]{"firefox", "63", "Mac 10.13"}
// };
// }
}
如果您想测试场景一,请取消注释测试中的内容。 对于场景 2,您可以按原样运行
@VinceBarresi - 两种情况下的问题都是由于您的测试代码造成的。 我不认为 TestNG 在这里有错。
场景一
出现错误org.testng.internal.reflect.MethodMatcherException: Data provider mismatch
是因为您将测试方法public void openSiteTest()
与返回 3 个参数defaultWebDataProvider()
的数据提供程序联系在一起,但您的测试方法在以下位置没有任何方法参数全部。 您需要确保测试方法和它所关联的数据提供者在参数的长度、类型和顺序方面匹配。 请修复您的测试代码。
场景二
错误Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="15">@DataProvider</strong> named : defaultWebDataProvider
再次是由于您的测试代码中的问题。 您将数据提供者移动到名为DataProviderManager
的不同类。 但是在您的@Test
方法中,您仅通过名称来引用数据提供者。 默认情况下,如果您不提供数据提供者所在的类名,TestNG 将始终在当前类中查找数据提供者。 由于它没有找到 TestNG 抱怨。 同样,您需要修复测试代码,以便正确引用数据提供者。
由于原始问题已解决,因此我将在问题回答时解决此问题
@krmahadevan这是我对 DataProvider 的误解 - 因为我不需要在测试本身中从它传递的参数(我需要它们在我的线程本地 getter 和 setter 中传递给 selenium 功能)我没有意识到我需要将它们传递给实际的测试方法。 我真的很感谢你解决这个问题!
如果您有时间,我确实还有一个关于并行性的问题 - 如何设置数据提供程序线程数和/或线程数,以便所有 5 个数据集来自
@DataProvider(parallel = true, name = "dp")
public static Object[][] defaultWebDataProvider() {
return new Object[][]{
new Object[]{"chrome", "70", "Windows 10"},
new Object[]{"internet explorer", "11", "Windows 10"},
new Object[]{"safari", "12.0", "Mac 10.13"},
new Object[]{"chrome", "70", "Mac 10.13"},
new Object[]{"firefox", "63", "Mac 10.13"}
};
}
每个@test在完全相同的时间运行? 目前,我可以并行运行,但它执行同一组(例如“chrome”、“70”、“Windows 10”)n 次线程次数,而不是同时运行每个组。
您需要将工厂( @Factory
注释)与数据提供程序一起使用。
工厂使用数据提供者基本上创建测试类实例(一个包含一个或多个@Test
方法的类),然后当它们运行时,TestNG 将确保它会运行一个实例中的所有测试方法(使用属性parallel=instances
)
@krmahadevan我正在使用@Factory ,它从我的 DataProvider 设置功能,包括浏览器、版本、平台,并初始化 WebDriver 的线程安全实例。 如果我设置 (parallel=instances) 测试确实并行运行,但正在运行多个实例,使用来自我的 DataProvider 的相同浏览器、版本、平台,如下所示:
我没有在 Safari、12、Mac 10.13 上运行多个线程,而是尝试在多个线程上并行运行测试 -
new Object[]{"chrome", "70", "Windows 10"},这应该是线程 1
new Object[]{"internet explorer", "11", "Windows 10"},这应该是线程 2
new Object[]{"safari", "12.0", "Mac 10.13"},这应该是线程 3
new Object[]{"chrome", "70", "Mac 10.13"},这应该是线程 4
new Object[]{"firefox", "63", "Mac 10.13"}这应该是线程 5
@VinceBarresi - 我已经为您关于堆栈溢出
简而言之,当您使用@Factory
和@DataProvider
来生成测试类实例时,TestNG 并行实例化测试类实例,但会运行每个@Test
依次在每个测试类中的方法。
@krmahadevan您在 StackOverflow 上的回复很有启发性,谢谢!
一个问题:假设您对每个测试使用相同的数据提供程序。 有没有办法避免在每个类中复制工厂代码?
谢谢!
@borbamartin - 您可以使用@Factory
注释中的dataProviderClass
属性让所有由@Factory
驱动的工厂共享同一个数据提供者。
你在 StackOverflow 上的回复很有启发,谢谢!
很高兴知道对你有帮助👍
@krmahadevan是的,让我改写一下。
假设我有 50 个要素类,每个要素类包含多个测试。 这意味着我必须写以下 50 次(在每个班级中)
@Factory(dataProvider = "browserMatrix")
public LoginFeature(BrowserConfig browserConfig) {
super.browserConfig = browserConfig;
}
问题是,TestNG 是否提供了一些我可以用来避免在每个测试类中编写它的东西?
再次感谢!
@borbamartin - 据我所知,TestNG 中没有任何东西可以自动为您执行此操作。 你需要自己做。