Как отключить тест TestNG на основе условия

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

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

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

Я хотел бы отключить тот же тест, основанный на состоянии, но не знаю как. что-то вроде этого:--5-->

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

любой имеет представление о том, возможно ли это или нет.

5 ответов


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

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


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

@BeforeMethod
protected void checkEnvironment() {
  if (!resourceAvailable) {
    throw new SkipException("Skipping tests because resource was not available.");
  }
}

есть два способа, которые я знаю, которые позволяют вам контролировать" отключение " тестов в TestNG.

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

пропустить исключение пример

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

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

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(){}

последним шагом является добавление прослушивателя в сборку.XML-файл. Мой закончил выглядеть так, это всего лишь одна строка из сборки.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>

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

  • использование аннотации @ Assumption
  • использование AssumptionListener с использованием предполагает.что(...) метод

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


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

Я не исследовал его тщательно, но я нашел другой способ: используя на @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(){

  }
}