TestNG. Пропустить выполнение testMethod в @beforeMethod вместо пропуска всех оставшихся testMethods - PullRequest
1 голос
/ 07 октября 2019

У меня есть проект, в котором перед каждым методом @Test я проверяю правильность данных аннотации метода. Если данные недействительны, я хочу пропустить тестовый метод и продолжить оставшуюся часть моего набора тестов.

Все синтаксический анализ и логика работают нормально, но из того, что я могу сказать, я использую неправильный инструментдля задания.

Мой код имеет ...


private SoftAssert s_assert = new SoftAssert();

@BeforeMethod
public void beforeMethod(Method m){
     //reads code
     if (dataNotCorrect)
          s_assert.fail();
}

@Test @MyCustomAnnotation(data = incorrect)
public void Test1(){
     //Do stuff
}

@Test @MyCustomAnnotation(data = correct)
public void Test2(){
     //Do stuff
}

В этом сценарии я хочу начать пытаться сделать оба, но при выполнении теста Test1 () должен быть пропущен и testngследует продолжить запуск Test2 (). Тем не менее, как только я улавливаю ошибку в Test1 (), он завершает весь набор в Test1 (). Пропуск не только Test1 (), но и Test2 ().

Я пробовал как с мягким утверждением, так и с обычным утверждением, но ни один из них не работает.

Ответы [ 3 ]

1 голос
/ 07 октября 2019

SkipException - это то, что вы ищете.

В beforeMethod проверьте свои данные и наберите SkipException, если они не верны. Это пропустит тест. В этом законченном, но простом примере, test2 пропускается:

import org.testng.SkipException;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;

public class TestA {

    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyCustomAnnotation {
        boolean dataCorrect();
    }

    @BeforeMethod
    public void beforeMethod(Method m) {
        if (!m.getAnnotation(MyCustomAnnotation.class).dataCorrect()) {
            throw new SkipException("Invalid data");
        }
    }

    @Test
    @MyCustomAnnotation(dataCorrect = true)
    public void test1() {
        System.out.println("test1");
    }

    @Test
    @MyCustomAnnotation(dataCorrect = false)
    public void test2() {
        System.out.println("test2");
    }
}

См. Также: Как использовать TestNG SkipException?

Вам также необходимо изменитьполитика сбоя конфигурации по умолчанию, чтобы позволить другим тестам запускаться, даже если один из них пропущен. Это делается на уровне набора:

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" configfailurepolicy="continue">
...
</suite>

Спасибо @Kyle OP за указание этого атрибута.

1 голос
/ 08 октября 2019

@ Бенуа получил большую часть моего пути, заменив мои утверждения на выброс SkipException. Но моя проблема с желанием пропустить текущий тест, а не каждый оставшийся тест, все еще осталась.

Проблема оказалась с configfailurepolicy в Testng. По умолчанию он пропускает (пропускает все оставшиеся тесты), когда я хотел, чтобы он был установлен на продолжение (продолжение остальной части набора).

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


1. Сначала создайте testng.xml и выполните тесты оттуда. Рядом с именем набора добавьте тег configfailurepolicy = "continue". Вот мой testng.xml ниже

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" configfailurepolicy="continue">
    <test name="MyTests" preserve-order="true">
        <classes>
            <class name="testclassLocation..." />
        </classes>
    </test>
</suite>

Убедитесь, что вы запускаете свои тесты из testng.xml, если вы делаете это таким образом.


2. Найдите, где находится .jar для testng. Я использую maven, поэтому он был "$ {user.dir} .m2 \ repository \ org \ testng \ testng \ 6.14.3".

Затем откройте архив .jar, просмотрите файл testng-1.0.dtd ', найдите строку

configfailurepolicy (skip | continue) "skip"

и измените ее на

configfailurepolicy (skip | continue) "continue"

После этого должно работать нормально.

Редактировать: Как уже упоминалосьв комментариях рекомендуется использовать первое решение, поскольку оно позволяет этим изменениям / исправлениям переноситься на несколько проектов / устройств. Второе решение будет применять только исправления к вашей машине.

0 голосов
/ 07 октября 2019

Создайте статический логический флаг в BeforeMethod, если данные неверны, просто измените флаг на true, а в Test of boolean is true сначала поверните флаг на false и провалите тест

Пример кода

public static Boolean myflag=false;

@BeforeMethod
public void beforeMethod(Method m){
     //reads code
     if (dataNotCorrect)
          myflag=true;
}

@Test @MyCustomAnnotation(data = incorrect)
public void Test1(){
     if(myflag){
       myflag=false;
       s_assert.fail();
}
...