Пропуск провайдера данных TestNG после сбоя

Например, у меня есть код для теста

@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"}
    };      
}

Например, тест с данными {"Три"} будет неудачным. Мне нужно, чтобы тесты для {"Четыре"}, {"Пять"} были пропущены или не прошли (если {"Три"} не удалось). Как я могу это сделать? Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
874
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Примечание. Это решение не сработает, если вы попытаетесь запустить тесты на основе данных параллельно. Это будет работать, только если вы запустите тесты на основе данных в последовательном порядке.

Вот как это сделать.

  1. Убедитесь, что вы используете TestNG 7.0.0-beta1 (это последняя выпущенная версия на сегодняшний день, 16 декабря 2018 г.)
  2. Пусть ваш тестовый класс реализует интерфейс org.testng.IHookable.
  3. Теперь в методе 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
===============================================

Большое спасибо. Помогает мне.

Veronika 17.12.2018 12:18

Другие вопросы по теме