TestNG провайдер данных пропускает после сбоя - PullRequest
0 голосов
/ 14 декабря 2018

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

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

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

1 Ответ

0 голосов
/ 16 декабря 2018

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

Вот как вы можете это сделать.

  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
===============================================
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...