Повторите определенный фрагмент кода в коде TestNG, если тест не пройден, а не весь тест - PullRequest
0 голосов
/ 21 июня 2019

Я хочу повторить некоторый код, специфичный для метода, если тест TestNG не пройден, и не повторять весь тест.

Здесь я рассмотрел пользовательские тестовые прослушиватели и анализаторы повторных попыток https://github.com/haojiwu/testng-retry-example. Это будетперезапустите весь тест, если он не пройдёт, я хочу какой-то метод-специфический код.

@Test()
public void testStuff() {
    String var1;
    String var2;

    /* Code specific to this test and should only be ran once. */
    doSomething(param1)

    /* Contains code looking for files that may or not be ready by the time the code is ran. */
    /* I want to try this code then wait and retry up to a max of 3 retries. */
    assertStuff(var1, var2);
}

Я хочу сделать код в doSomething (param1), попробуйте материал в assertStuff (var1, var2), если утверждаетсяв этом случае я хочу подождать около 5 секунд, а затем повторить код assertStuff (var1, var2), если подтверждение пройдено, затем пройден тест, иначе повторите еще 2 раза.

Ответы [ 3 ]

0 голосов
/ 22 июня 2019

Более простой способ сделать это без необходимости зависеть от RetryAnalyzer (одна проблема с RetryAnalyzer, если вы не используете последнюю бета-версию, а именно, 7.0.0-beta5 или выше, заключается в том, что вам необходимо взять на себя ответственность за обрезку дубликата).результаты теста, полученные в результате повторного судебного разбирательства).

Вместо этого вы можете создать простой механизм опроса вокруг вашего assertStuff() метода и вернуть ему true или false, который вы можете утверждать.

Вот пример.Для удобства я использовал org.openqa.selenium.support.ui.FluentWait, поскольку его API довольно лаконичны

import java.time.Duration;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.function.Supplier;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.support.ui.FluentWait;
import org.testng.Assert;
import org.testng.annotations.Test;

public class TestClass {
  private static final int max = 5;

  @Test
  public void testStuff() {
    doSomething();
    boolean wasAsserted = assertStuff(2);
    Assert.assertTrue(wasAsserted);
  }

  @Test
  public void testStuffThatFails() {
    doSomething();
    boolean wasAsserted = assertStuff(10);
    Assert.assertTrue(wasAsserted);
  }

  private boolean assertStuff(int retries) {
    final AtomicInteger integer = new AtomicInteger(0);
    Supplier<Integer> input = integer::getAndIncrement;
    FluentWait<Supplier<Integer>> checker =
        new FluentWait<>(input)
            .pollingEvery(Duration.ofSeconds(2))
            .withTimeout(Duration.ofSeconds(10));
    try {
      return checker.until(getCondition(retries));
    } catch (TimeoutException e) {
      return false;
    }
  }

  private Function<Supplier<Integer>, Boolean> getCondition(int retries) {
    return integerSupplier -> {
      int current = integerSupplier.get();
      return current == retries || current > max;
    };
  }

  private void doSomething() {
    System.err.println("I did something");
  }
}
0 голосов
/ 22 июня 2019

В простом, мы пытаемся так же

    int iterate=5;
    boolean status=false;

    while(iterate >=1 && status ==false) {

        try {
            assertEquals("false", "true");
            status=true;
        }catch (AssertionError e) {
            iterate--;
            Thread.sleep(500);
        }
    }
0 голосов
/ 21 июня 2019

Возможно, вы захотите использовать функцию TestNG retryAnalyzer , но только для части assertStuff(var1, var2).

Поэтому вы должны переместить doSomething(param1) в отдельный метод, помеченный @BeforeClass (или @BeforeMethod):

...
@BeforeClass
public void initSomething() {
    doSomething(param1);
}

@Test(retryAnalyzer = ThreeRetries.class)
public void testStuff() {
    String var1;
    String var2;

    assertStuff(var1, var2);
}

В качестве альтернативы вы можете использовать аннотацию @Test для обязательной части и объявить зависимость между тестами, например ::

...
@Test
public void initSomething() {
    doSomething(param1);
}

@Test(retryAnalyzer = ThreeRetries.class, dependsOnMethods = "initSomething")
public void testStuff() {
    String var1;
    String var2;

    assertStuff(var1, var2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...