Вот один из способов сделать это.Пожалуйста, не стесняйтесь расширять это решение так, чтобы оно соответствовало действительности.
- Убедитесь, что вы используете TestNG
7.0.0-beta1
(последняя выпущенная на сегодня версия) - В вашем комплектеXML-файл, добавьте параметр уровня набора, который захватывает все значения состояний, для которых необходимо повторить тесты, разделяя их на
,
- Создание реализации
org.testng.IAlterSuiteListener
, которая в основном разбивает параметр уровня набора на несколькопараметров, повторяет тесты в наборе, клонирует их и добавляет параметры разделения к каждому из тестов.
В приведенном ниже примере должно быть показано, как это будет работать.
Тестовый класс выглядит следующим образом:
package com.rationaleemotions.stackoverflow.qn53803675;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class SampleTestClass {
@Test
@Parameters("state")
public void testMethodOne(int state) {
printer(state);
}
@Test
@Parameters("state")
public void testMethodTwo(int state) {
printer(state);
}
private void printer(int state) {
ITestResult result = Reporter.getCurrentTestResult();
String methodname = result.getMethod().getMethodName();
String testname = result.getTestContext().getName();
String msg =
String.format("%s() from <%s> running with state [%d]", methodname, testname, state);
System.err.println(msg);
}
}
Вот как будет выглядеть слушатель, изменяющий комплект
package com.rationaleemotions.stackoverflow.qn53803675;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.testng.IAlterSuiteListener;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
public class SimpleSuiteAlterer implements IAlterSuiteListener {
@Override
public void alter(List<XmlSuite> suites) {
XmlSuite suite = suites.get(0);
// Fetch the suite level parameter called "states" and split it by comma
// We will get all the states that we need to run for.
String[] states = suite.getParameter("states").split(",");
// We are going to assume that only those <test> tags that begin with "dynamic"
// in their names will be considered for multiple execution.
List<XmlTest> dynamictests =
suite
.getTests()
.stream()
.filter(xmlTest -> xmlTest.getName().startsWith("dynamic"))
.collect(Collectors.toList());
List<XmlTest> clonedTests = new ArrayList<>();
for (XmlTest each : dynamictests) {
for (int i = 1; i < states.length; i++) {
XmlTest cloned = new XmlTest(suite);
cloned.addParameter("state", states[i]);
cloned.setName(each.getName() + "_cloned");
cloned.getXmlClasses().addAll(each.getClasses());
clonedTests.add(cloned);
}
each.addParameter("state", states[0]);
}
dynamictests.addAll(clonedTests);
}
}
Вот как XML-файл комплектавыглядит как
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="53803675_suite" parallel="false" verbose="2">
<listeners>
<listener class-name="com.rationaleemotions.stackoverflow.qn53803675.SimpleSuiteAlterer"/>
</listeners>
<parameter name="states" value="1,2"/>
<test name="dynamic-53803675-test">
<classes>
<class name="com.rationaleemotions.stackoverflow.qn53803675.SampleTestClass"/>
</classes>
</test>
</suite>
Вот как выглядит вывод
...
... TestNG 7.0.0-beta1 by Cédric Beust (cedric@beust.com)
...
testMethodOne() from <dynamic-53803675-test> running with state [1]
testMethodTwo() from <dynamic-53803675-test> running with state [1]
testMethodOne() from <dynamic-53803675-test_cloned> running with state [2]
PASSED: testMethodOne(1)
PASSED: testMethodTwo(1)
===============================================
dynamic-53803675-test
Tests run: 2, Failures: 0, Skips: 0
===============================================
testMethodTwo() from <dynamic-53803675-test_cloned> running with state [2]
PASSED: testMethodOne(2)
PASSED: testMethodTwo(2)
===============================================
dynamic-53803675-test_cloned
Tests run: 2, Failures: 0, Skips: 0
===============================================
===============================================
53803675_suite
Total tests run: 4, Passes: 4, Failures: 0, Skips: 0
===============================================
Process finished with exit code 0