Как отключить тест TestNG на основе условия - PullRequest
21 голосов
/ 16 октября 2010

Есть ли в настоящее время способ отключить тест TestNG на основе условия

Я знаю, что в настоящее время вы можете отключить тест, как и в TestNG:

@Test(enabled=false, group={"blah"})
public void testCurrency(){
...
}

Я хотел бы отключить тот же тест на основе условия, но не знаю как. как то так:

@Test(enabled={isUk() ? false : true), group={"blah"})
public void testCurrency(){
...
}

Каждый знает, возможно ли это или нет.

Ответы [ 6 ]

34 голосов
/ 14 декабря 2010

Более простой вариант - использовать аннотацию @BeforeMethod для метода, который проверяет ваше состояние. Если вы хотите пропустить тесты, просто бросьте SkipException . Как это:

@BeforeMethod
protected void checkEnvironment() {
  if (!resourceAvailable) {
    throw new SkipException("Skipping tests because resource was not available.");
  }
}
14 голосов
/ 16 октября 2010

У вас есть два варианта:

Ваш преобразователь аннотаций проверит условие, а затем переопределит аннотацию @Test, добавив атрибут "enabled = false", если условие не выполнено.

8 голосов
/ 19 марта 2014

Существует два известных мне способа, позволяющих вам контролировать «отключение» тестов в TestNG.

Различие, которое очень важно отметить, состоит в том, что SkipException прервет все последующие тесты, в то время как реализация IAnnotationTransformer использует Reflection для отмены отдельных тестов в зависимости от указанного условия. Я объясню как SkipException, так и IAnnotationTransfomer.

Пример исключения SKIP

import org.testng.*;
import org.testng.annotations.*;

public class TestSuite
{
    // You set this however you like.
    boolean myCondition;

    // Execute before each test is run
    @BeforeMethod
    public void before(Method methodName){
        // check condition, note once you condition is met the rest of the tests will be skipped as well
        if(myCondition)
            throw new SkipException();
    }

    @Test(priority = 1)
    public void test1(){}

    @Test(priority = 2)
    public void test2(){}

    @Test(priority = 3)
    public void test3(){}
}

IAnnotationTransformer example

Немного сложнее, но идея, лежащая в основе, - это концепция, известная как Отражение.

Wiki - http://en.wikipedia.org/wiki/Reflection_(computer_programming)

Сначала реализуйте интерфейс IAnnotation, сохраните его в файле * .java.

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.testng.IAnnotationTransformer;
import org.testng.annotations.ITestAnnotation;

public class Transformer implements IAnnotationTransformer {

// Do not worry about calling this method as testNG calls it behind the scenes before EVERY method (or test).
// It will disable single tests, not the entire suite like SkipException
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod){

    // If we have chose not to run this test then disable it.
    if (disableMe()){
        annotation.setEnabled(false);
    }
}

// logic YOU control
private boolean disableMe()){
}

Затем в вашем тестовом наборе java-файла выполните следующее в функции @BeforeClass

import org.testng.*;
import org.testng.annotations.*;

/* Execute before the tests run. */    
@BeforeClass
public void before(){

    TestNG testNG = new TestNG();
    testNG.setAnnotationTransformer(new Transformer());
}

@Test(priority = 1)
public void test1(){}

@Test(priority = 2)
public void test2(){}

@Test(priority = 3)
public void test3(){}

Последний шаг - добавление прослушивателя в файл build.xml. Мой получился похожим на это, это всего лишь одна строка из build.xml:

<testng classpath="${test.classpath}:${build.dir}" outputdir="${report.dir}" 
    haltonfailure="false" useDefaultListeners="true"
    listeners="org.uncommons.reportng.HTMLReporter,org.uncommons.reportng.JUnitXMLReporter,Transformer" 
    classpathref="reportnglibs"></testng>
2 голосов
/ 22 июля 2018

A Третья опция также может иметь значение Допущение Допущения для TestNG - Если допущение не выполняется, TestNG получит команду игнорировать тестовый пример и, следовательно, не выполнит его.

  • Использование аннотации @Assump
  • Использование AssumpListener Использование метода Assumes.assumeThat (...)

Вы можете использовать этот пример: пример

0 голосов
/ 18 января 2019

SkipException: это полезно, если у нас есть только один метод @Test в классе.Как и в случае с Data Driven Framework, у меня есть только один метод Test, который необходимо выполнить или пропустить на основании какого-либо условия.Поэтому я поместил логику для проверки условия в метод @Test и получил желаемый результат.Это помогло мне получить отчет по экстентам с результатами теста в виде Pass / Fail и, в частности, Skip.

0 голосов
/ 18 апреля 2017

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

Я не исследовал это полностью, но нашел другой способ: использование атрибута dependsOnMethods в аннотации @Test:

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

public class MyTest {

  private boolean conditionX = true;
  private boolean conditionY = false;

  @Test
  public void isConditionX(){
    if(!conditionX){
      throw new SkipException("skipped because of X is false");
    }
  }

  @Test
  public void isConditionY(){
    if(!conditionY){
      throw new SkipException("skipped because of Y is false");
    }
  }

  @Test(dependsOnMethods="isConditionX")
  public void test1(){

  }

  @Test(dependsOnMethods="isConditionY")
  public void test2(){

  }
}
...