Могу ли я указать группу для всего класса в тестовом примере TestNG?
У меня есть базовый класс, представляющий тест базы данных в TestNG, и я хочу указать, что все классы, выходящие из этого класса, относятся к группе «db-test», однако я обнаружил, что это не представляется возможным. Я пробовал аннотацию @Test:
@Test(groups = { "db-test" })
public class DBTestBase {
}
Однако это не работает, потому что аннотация @Test будет пытаться превратить кучу методов в тесты, а предупреждения / ошибки появляются в eclipse при запуске тестов.
Поэтому я попытался отключить тест, чтобы хотя бы группы были назначены:
@Test(enabled = false, groups = { "db-test" })
public class DBTestBase {
}
но тогда любые @BeforeTest (и другие подобные аннотации) ТАКЖЕ отключаются ... что, конечно, не то, что я хочу.
Я хотел бы каким-то образом аннотировать класс как принадлежащий к определенному типу группы, но это не совсем возможно в TestNG. У кого-нибудь есть другие идеи?
Ответов (5)5
Ответ - через настраиваемый org.testng.IMethodSelector :
Его includeMethod () может исключить любой метод, который мы хотим, например общедоступный неаннотированный метод.
Однако, чтобы зарегистрировать собственный Java MethodSelector, вы должны добавить его в экземпляр XMLTest, управляемый любым TestRunner, что означает, что вам понадобится ваш собственный TestRunner .
Но чтобы создать собственный TestRunner, вам необходимо зарегистрировать TestRunnerFactory с помощью параметра -testrunfactory .
НО этот -testrunfactory НИКОГДА не учитывается классом TestNG ... поэтому вам также необходимо определить собственный класс TestNG:
- чтобы переопределить метод configure (Map),
- так что вы можете установить TestRunnerFactory
- TestRunnerFactory, который создаст вам собственный TestRunner,
- TestRunner, который установит для экземпляра XMLTest настраиваемый XMLMethodSelector
- XMLMethodSelector, который создаст собственный IMethodSelector
- IMethodSelector, который исключит любые методы TestNG по вашему выбору!
Хорошо ... это кошмар. Но это также проблема кода, так что это должно быть немного сложно;)
Весь код доступен в сниппетах DZone .
Как обычно для проверки кода:
- один класс java (и довольно много внутренних классов)
- скопируйте и вставьте класс в каталог 'source / test' (поскольку пакет 'test')
- запустите его (аргументы не нужны)
Обновление от Майка Стоуна:
Я собираюсь принять это, потому что это звучит довольно близко к тому, чем я закончил, но я решил, что добавлю и то, что я сделал.
По сути, я создал аннотацию групп, которая ведет себя как свойство групп аннотаций Test (и других).
Затем я создал GroupAnnotationTransformer, который использует IAnnotationTransformer для просмотра всех тестов и определяемых тестовых классов, а затем модифицирует тест, добавляя группы, что отлично работает с исключением и включением групп.
Измените сборку, чтобы использовать новый преобразователь аннотаций, и все работает отлично!
Что ж ... с одной оговоркой, он не добавляет группы в методы, не являющиеся тестовыми ... потому что в то время, когда я это делал, был еще один преобразователь аннотаций, который позволяет преобразовывать ВСЕ, но он почему-то не был включен в TestNG, который я использовал по какой-то причине ... так что было бы неплохо сделать ваши аннотированные методы до / после alwaysRun = true ... чего для меня достаточно.
В итоге я могу:
@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
@Test
@Groups("aMethodLevelGroup")
public void myTest() {
}
}
И я заставил трансформатор работать с подклассами и всем остальным.
Я не уверен, как наследование аннотаций работает в TestNG, но эта статья может быть полезна.
На самом деле, это может помочь лучше , посмотрите на inheritGroups.
Вы можете указать аннотацию @Test на уровне метода, что обеспечивает максимальную гибкость.
public class DBTestBase {
@BeforeTest(groups = "db-test")
public void beforeTest() {
System.out.println("Running before test");
}
public void method1() {
Assert.fail(); // this does not run. It does not belong to 'db-test' group.
}
@Test(groups = "db-test")
public void testMethod1() {
Assert.assertTrue(true);
}
}
Это работает для вас, или мне что-то не хватает в вашем вопросе.
Мне показалось, что это следующий код-вызов (сообщение вики сообщества):
Как иметь возможность выполнять все тестовые методы класса Extended из группы aGlobalGroup без:
- указание группы 'aGlobalGroup' в самом расширенном классе?
- тестирование неаннотированных общедоступных методов расширенного класса?
Первый ответ прост:
добавьте класс TestNG (groups = {"aGlobalGroup"}) на уровне базового класса.
Эта группа будет применяться ко всем общедоступным методам как базового, так и расширенного класса.
НО: в эту группу будут включены даже общедоступные методы, не относящиеся к testng (без аннотации TestNG).
ПРОБЛЕМА: избегайте включения тех методов, которые не относятся к TestNG.
@Test(groups = { "aGlobalGroup" })
public class Base {
/**
*
*/
@BeforeClass
public final void setUp() {
System.out.println("Base class: @BeforeClass");
}
/**
* Test not part a 'aGlobalGroup', but still included in that group due to the class annotation. <br />
* Will be executed even if the TestNG class tested is a sub-class.
*/
@Test(groups = { "aLocalGroup" })
public final void aFastTest() {
System.out.println("Base class: Fast test");
}
/**
* Test not part a 'aGlobalGroup', but still included in that group due to the class annotation. <br />
* Will be executed even if the TestNG class tested is a sub-class.
*/
@Test(groups = { "aLocalGroup" })
public final void aSlowTest() {
System.out.println("Base class: Slow test");
//throw new IllegalArgumentException("oups");
}
/**
* Should not be executed. <br />
* Yet the global annotation Test on the class would include it in the TestNG methods...
*/
public final void notATest() {
System.out.println("Base class: NOT a test");
}
/**
* SubClass of a TestNG class. Some of its methods are TestNG methods, other are not. <br />
* The goal is to check if a group specify in the super-class will include methods of this class. <br />
* And to avoid including too much methods, such as public methods not intended to be TestNG methods.
* @author <a href="http://stackoverflow.com/users/6309/vonc">VonC</a>
*/
public static class Extended extends Base
{
/**
* Test not part a 'aGlobalGroup', but still included in that group due to the super-class annotation. <br />
* Will be executed even if the TestNG class tested is a sub-class.
*/
@Test
public final void anExtendedTest() {
System.out.println("Extended class: An Extended test");
}
/**
* Should not be executed. <br />
* Yet the global annotation Test on the class would include it in the TestNG methods...
*/
public final void notAnExtendedTest() {
System.out.println("Extended class: NOT an Extended test");
}
}