Например, у меня есть код для теста
@Test(dataprovider = "getData")
public void test(String data) {
//perform some action using 'data'
}
@DataProvider
public Object[][] getData(){
return new Object[][]{
{"One"},
{"Two"},
{"Three"},
{"Four"},
{"Five"}
};
}
Например, тест с данными {"Три"} будет неудачным. Мне нужно, чтобы тесты для {"Четыре"}, {"Пять"} были пропущены или не прошли (если {"Три"} не удалось). Как я могу это сделать? Спасибо.




Примечание. Это решение не сработает, если вы попытаетесь запустить тесты на основе данных параллельно. Это будет работать, только если вы запустите тесты на основе данных в последовательном порядке.
Вот как это сделать.
7.0.0-beta1 (это последняя выпущенная версия на сегодняшний день, 16 декабря 2018 г.)org.testng.IHookable.run() установите логический флаг, чтобы указать, что нижестоящие методы должны быть неудачными, если вы обнаружили исключение (TestNG по умолчанию отмечает метод тестирования как неудачный, если он вызывает исключение)Ниже приведен пример, демонстрирующий все это в действии.
import java.util.Arrays;
import org.testng.Assert;
import org.testng.IHookCallBack;
import org.testng.IHookable;
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(TestReporter.class)
public class TestclassExample implements IHookable {
private boolean hasFailures = false;
@Test(dataProvider = "getData")
public void test(String data) {
if (data.equals("Three")) {
Assert.fail("Simulating a failure for [" + data + "]");
}
System.err.println("executing test for data [" + data + "]");
}
@DataProvider
public Object[][] getData() {
return new Object[][] {{"One"}, {"Two"}, {"Three"}, {"Four"}, {"Five"}};
}
@Override
public void run(IHookCallBack callBack, ITestResult testResult) {
if (hasFailures) {
testResult.setStatus(ITestResult.FAILURE);
} else {
callBack.runTestMethod(testResult);
if (testResult.getThrowable() != null) {
hasFailures = true;
}
}
}
public static class TestReporter implements ITestListener {
@Override
public void onTestFailure(ITestResult result) {
String msg =
String.format(
"[%s()] failed for data %s",
result.getMethod().getMethodName(), Arrays.toString(result.getParameters()));
System.err.println(msg);
}
}
}
Вот результат выполнения вышеуказанного кода.
executing test for data [One]
executing test for data [Two]
[test()] failed for data [Three]
[test()] failed for data [Four]
[test()] failed for data [Five]
java.lang.AssertionError: Simulating a failure for [Three]
at org.testng.Assert.fail(Assert.java:97)
at com.rationaleemotions.stackoverflow.qn53781839.TestclassExample.test(TestclassExample.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:131)
at org.testng.internal.MethodInvocationHelper$1.runTestMethod(MethodInvocationHelper.java:237)
at com.rationaleemotions.stackoverflow.qn53781839.TestclassExample.run(TestclassExample.java:36)
at org.testng.internal.MethodInvocationHelper.invokeHookable(MethodInvocationHelper.java:249)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:654)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:792)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1103)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at org.testng.TestRunner.privateRun(TestRunner.java:739)
at org.testng.TestRunner.run(TestRunner.java:589)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:398)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:392)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:354)
at org.testng.SuiteRunner.run(SuiteRunner.java:302)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1145)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1067)
at org.testng.TestNG.runSuites(TestNG.java:997)
at org.testng.TestNG.run(TestNG.java:965)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:73)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
===============================================
Default Suite
Total tests run: 5, Passes: 2, Failures: 3, Skips: 0
===============================================
Большое спасибо. Помогает мне.