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());
}
}
test.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 из командной строки и даже задав эти значения в теге config для плагина surefire, но ничего не работает.
Пожалуйста, поделитесь тестовым примером (как можно меньшего размера), который показывает проблему
@VinceBarresi - я не совсем понимаю, как вы утверждаете, что TestNG запускает тесты последовательно.
Я изменил ваш тестовый класс, чтобы распечатать идентификаторы потоков, и вот как это выглядит
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
===============================================
Как вы можете видеть из вышеприведенного вывода, идентификаторы потоков различны (два потока, чтобы быть конкретными, поскольку наше количество потоков равно 2)
Ваш поставщик данных в вашем примере привязан к фабричному методу, а НЕ к методу @Test
. Таким образом, он не будет играть никакой роли в количестве выполняемых потоков.
Только когда произойдет следующее -
@Test
@DataProvider
установлен в true
parallel
устанавливается в methods
в теге <suite>
(или) <test>
data-provider-thread-count
значение установлено на значение больше 1Параллелизм будет включен в TestNG, и количество методов @Test
поддерживаемых поставщиком данных, будет равно количеству потоков, установленных с помощью атрибута data-provider-thread-count.
Примечание. Атрибут thread-count
в XML-файле набора применим ТОЛЬКО к ОБЫЧНЫМ методам, а атрибут data-provider-thread-count
в XML-файле набора применим ТОЛЬКО к методу тестирования, управляемому поставщиком данных.
Пожалуйста, дайте мне знать, имеет ли это объяснение смысл и можно ли решить эту проблему.
@krmahadevan Спасибо за подробный ответ. Я бы хотел пробежать сам, чтобы проверить это, когда у меня будет возможность. У меня есть пара вопросов,
1. Должен ли поставщик данных (в данном случае - "dp") быть в том же классе, что и передаем поставщик данных, чтобы по-прежнему обеспечивать параллелизм с помощью data-provider-thread-count и parallel = true ?
2: Вы выполняли тесты на уровне набора? Если да, то имеет ли это значение с точки зрения параллелизма? Например, если я отключаю свои тесты группы DEBUG через surefire с помощью mvn test -Dgroups = DEBUG, нужно ли мне передавать число потоков поставщика данных через параметр в этой команде?
1: Должен ли поставщик данных (в данном случае - "dp") быть в том же классе, что и
@Test
которому мы передаем поставщик данных, чтобы по-прежнему обеспечивать параллелизм с помощью подсчета потоков поставщика данных а параллельный = правда?
Не обязательно. Не имеет значения, где находится поставщик данных.
2: Вы выполняли тесты на уровне набора? Если да, то имеет ли это значение с точки зрения параллелизма? Например, если я отключаю свои тесты группы DEBUG через surefire с помощью mvn test -Dgroups = DEBUG, нужно ли мне передавать число потоков поставщика данных через параметр в этой команде?
Да, я выполнил тесты на уровне набора. Это не имеет значения. В качестве
пока счетчик потоков поставщика данных доступен в файле пакета
(значение по умолчанию, если оно не указано, я считаю 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
===============================================
Есть мысли по этому поводу?
Не могли бы вы поделиться тестовым кодом, который вы использовали для запуска ошибки?
Я использую точный файл test.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.
Сценарий 1
Ошибка org.testng.internal.reflect.MethodMatcherException: Data provider mismatch
возникает из-за того, что вы связываете тестовый метод public void openSiteTest()
с поставщиком данных, который возвращает 3 параметра defaultWebDataProvider()
но ваш тестовый метод не имеет аргументов метода в все. Вам необходимо убедиться, что метод тестирования и поставщик данных, с которым он связан, совпадают по параметрам с точки зрения длины, типа и порядка параметров. Исправьте свой тестовый код.
Сценарий 2
Ошибка 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 с моей стороны - поскольку мне не нужны параметры, переданные из него в самом тесте (они нужны мне в моих потоковых локальных геттерах и сеттерах для перехода к возможностям селена), я не понимал, что мне нужен чтобы передать их фактическому методу тестирования. Я очень ценю, что вы прояснили это!
У меня есть еще один вопрос о параллелизме, если у вас есть момент - Как мне установить количество потоков поставщика данных и / или количество потоков, чтобы все 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 = instance), тест будет выполняться параллельно, но будет запущено несколько экземпляров с одним и тем же браузером, версией и платформой из моего DataProvider, как вы можете видеть ниже:
Вместо того, чтобы запускать несколько потоков, каждый из них в Safari, 12, Mac 10.13, я пытаюсь запустить тест с несколькими потоками параллельно с -
new Object [] {"chrome", "70", "Windows 10"}, ЭТО ДОЛЖНА БЫТЬ НИТИ 1
new Object [] {"internet explorer", "11", "Windows 10"}, ЭТО ДОЛЖНА БЫТЬ НИТКОЙ 2
новый объект [] {"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 нет ничего, что автоматически сделало бы это за вас. Вам нужно будет сделать это самому.