Как отключить тест TestNG на основе условия
Есть ли в настоящее время способ отключить тест TestNG на основе условия
Я знаю, что в настоящее время вы можете отключить тест как в TestNG:
@Test(enabled=false, group={"blah"})
public void testCurrency(){
...
}
Я хотел бы отключить тот же тест на основе условия, но не знаю как. что-то вроде этого:
@Test(enabled={isUk() ? false : true), group={"blah"})
public void testCurrency(){
...
}
Любой знает, возможно ли это или нет.
Ответы
Ответ 1
У вас есть два варианта:
Ваш аннотационный трансформатор проверит условие и затем переопределит аннотацию @Test, чтобы добавить атрибут "enabled = false", если условие не выполнено.
Ответ 2
Более простой вариант - использовать аннотацию @BeforeMethod для метода, который проверяет ваше состояние. Если вы хотите пропустить тесты, просто нажмите SkipException. Вот так:
@BeforeMethod
protected void checkEnvironment() {
if (!resourceAvailable) {
throw new SkipException("Skipping tests because resource was not available.");
}
}
Ответ 3
Есть два способа, которыми я знаю, которые позволяют вам контролировать "отключение" тестов в 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
Немного сложнее, но идея, стоящая за ней, - это концепция, известная как Reflection.
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>
Ответ 4
Третий вариант также может быть "Предположительные предположения для TestNG". Если допущение не выполняется, TestNG будет проинструктировано игнорировать контрольный пример и, следовательно, не выполнит его.
- Использование аннотации @Assulation
- Использование AssumpListener Использование метода Assumes.assumeThat(...)
Вы можете использовать этот пример: пример
Ответ 5
SkipException: полезно, если у нас есть только один метод @Test в классе. Как и в случае с Data Driven Framework, у меня есть только один метод Test, который необходимо выполнить или пропустить на основе некоторого значения. Поэтому я поместил логику для проверки значения внутри метода @Test и получил желаемый результат.
Ответ 6
Бросьте 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(){
}
}