Могу ли я указать группу классов в тестовом примере 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. У кого-нибудь есть другие идеи?
Ответы
Ответ 1
Ответ осуществляется с помощью настраиваемого org.testng.IMethodSelector:
Его includeMethod() может исключить любой метод, который мы хотим, например, общедоступный не аннотированный метод.
Однако, чтобы зарегистрировать собственный метод Java MethodSelector, вы должны добавить его в экземпляр XMLTest, управляемый любым TestRunner, что означает, что вам нужен собственный собственный TestRunner.. p >
Но для создания пользовательского TestRunner вам необходимо зарегистрировать TestRunnerFactory, используя опцию -testrunfactory.
НО, что -testrunfactory НИКОГДА не учитывается классом TestNG... поэтому вам также нужно определить собственный класс TestNG:
- чтобы переопределить метод configure (Map),
- чтобы вы могли установить TestRunnerFactory
- TestRunnerFactory, который построит вам пользовательский TestRunner,
- TestRunner, который установит в экземпляр XMLTest собственный XMLMethodSelector
- XMLMethodSelector, который будет создавать пользовательский IMethodSelector
- IMethodSelector, который исключает любые методы TestNG по вашему выбору!
Хорошо... это кошмар. Но это также вызов кода, поэтому он должен быть немного сложным;)
Весь код доступен в фрагменты DZone.
Как обычно для вызова кода:
- один класс java (и довольно много внутренних классов)
- скопировать-вставить класс в каталог "источник/тест" (поскольку пакет "test" )
- запустите его (нет необходимости в аргументах)
Обновление от Майка Стоуна:
Я собираюсь принять это, потому что это звучит довольно близко к тому, что я закончил, но я решил, что добавлю то, что я сделал.
В принципе, я создал аннотацию групп, которая ведет себя как свойство групп тестовых (и других) аннотаций.
Затем я создал GroupAnnotationTransformer, который использует IAnnotationTransformer для просмотра всех тестируемых и тестируемых классов, а затем модифицирует тест для добавления групп, который отлично работает с исключением группы и включением.
Измените сборку, чтобы использовать новый трансформатор аннотаций, и все работает отлично!
Ну... одна из предостережений заключается в том, что он не добавляет группы к не-тестовым методам... потому что в то время, когда я это делал, появился другой трансформатор аннотаций, который позволяет вам преобразовывать НИЧЕГО, но это как-то не было 't включен в TestNG, который я использовал по какой-то причине... так что это хорошая идея сделать ваши до/после аннотированных методов alwaysRun = true..., что достаточно для меня.
В результате я могу сделать:
@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
@Test
@Groups("aMethodLevelGroup")
public void myTest() {
}
}
И я сделал работу трансформатора с подклассом и всем.
Ответ 2
TestNG будет запускать все общедоступные методы из класса с аннотацией @Test. Возможно, вы могли бы изменить методы, которые не хотите, чтобы TestNG запускался, чтобы быть непубличным.
Ответ 3
Я не уверен, как наследование аннотаций работает для TestNG, но эта статья может пригодиться. http://beust.com/weblog/archives/000170.html.
Собственно, это может помочь лучше http://testng.org/doc/documentation-main.html#annotations, посмотрите на inheritGroups.
Ответ 4
Мне кажется, что следующий код-вызов (сообщество wiki post):
Как выполнить все методы тестирования расширенного класса из группы "aGlobalGroup" без:
- определение группы 'aGlobalGroup' в самом расширенном классе?
- тестирование не аннотированных общедоступных методов расширенного класса?
Первый ответ прост:
добавить класс TestNG (groups = { "aGlobalGroup" }) на уровне базового класса
Эта группа будет применяться ко всем общедоступным методам как базового класса, так и расширенного класса.
НО: даже общедоступные методы без тестирования (без аннотации 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");
}
}
Ответ 5
Вы можете указать аннотацию @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);
}
}
Это работает для вас или я что-то упустил из вашего вопроса.