У меня есть базовый класс, который представляет тест базы данных в TestNG, и я хочу указать, что все классы, расширяющиеся от этого класса, относятся к группе "db-test", однако я обнаружил, что это не представляется возможным. Я пробовал использовать аннотацию @Test:
@Test(groups = { "db-test" })
public class DBTestBase {
}
Однако это не работает, потому что аннотация @Test пытается превратить кучу методов в тесты, и при запуске тестов в eclipse появляются предупреждения/ошибки.
Поэтому я попробовал отключить тест, чтобы хотя бы группы были назначены:
@Test(enabled = false, groups = { "db-test" })
public class DBTestBase {
}
но тогда все @BeforeTest (и другие подобные аннотации) ВСЕГДА будут отключены... что, конечно, не то, чего я хочу.
Я бы хотел каким-то образом аннотировать класс как принадлежащий к определенному типу группы, но это не представляется возможным в TestNG. Есть ли у кого-нибудь другие идеи?
TestNG будет выполнять все публичные методы класса с аннотацией @Test. Возможно, вы могли бы изменить методы, которые вы не хотите, чтобы TestNG запускал, на непубличные.
Ответ через обычай org.testng. IMethodSelector :
includeMethod () может исключить любой метод, который мы хотим, как общественность не - аннотируемый метод.
Однако, чтобы зарегистрировать обычай Ява MethodSelector, Вы должны добавить его к XMLTest случай, управляемый любым TestRunner, что означает, что Вам нужно Ваше собственное обычай TestRunner .
Но, чтобы построить обычай TestRunner, Вы должны зарегистрироваться TestRunnerFactory , через -testrunfactory выбор.
НО это,-testrunfactory никогда не принимается во внимание TestNG класс..., таким образом, Вы должны также определить обычай класс TestNG:
Хорошо... it' s кошмар. Но это - также кодовая проблема, таким образом, это должно быть немного оспаривания;)
Весь кодекс доступен в отрывки DZone .
Как обычно, для кодовой проблемы:
Обновление от Майка Стоуна:
I' m собирающийся принимать это, потому что это кажется достаточно близким к тому, что я закончил тем, что делал, но я полагал, что добавлю, что я сделал также.
В основном я создал аннотацию Групп, которая ведет себя как собственность групп Теста (и другой) аннотации.
Затем я создал GroupsAnnotationTransformer, который использует IAnnotationTransformer, чтобы посмотреть на все тесты и испытательные определяемые классы, затем изменяет тест, чтобы добавить группы, который работает отлично с исключением группы и включением.
Измените строить, чтобы использовать новый трансформатор аннотации, и все это работает отлично!
Хорошо... один протест состоит в том что это doesn' t добавляют группы к неметодам испытаний..., потому что в то время, когда я сделал это, был другой трансформатор аннотации, который позволяет Вам преобразовать ЧТО-ЛИБО, но это так или иначе wasn' t включенный в TestNG я использовал по некоторым причинам..., таким образом, это - хорошая идея сделать Ваш перед/после того, как аннотируемыми методами к alwaysRun=true..., который достаточен для меня.
Конечный результат, я могу сделать:
@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
@Test
@Groups("aMethodLevelGroup")
public void myTest() {
}
}
И я заставил трансформатор работать с подклассификацией и всем.
Я не уверен, как работает наследование аннотаций в TestNG, но эта статья может быть полезной.
На самом деле, это может помочь лучше, посмотрите на inheritGroups.
Это казалось бы мне как следующее кодовая проблема (сообщество почта Wiki):
Как быть в состоянии выполнить все методы испытаний Расширенного класса от группы ' aGlobalGroup' без:
Первый ответ легок:
добавьте класс TestNG (группы = {" aGlobalGroup"}) на уровне Базового класса
Та группа обратится ко всем общественным методам и Базового класса и Расширенного класса.
НО: даже общественные методы non-testng (без аннотации TestNG) будут включены в ту группу.
ПРОБЛЕМА: избегайте включая те non-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");
}
}
Вы можете указать аннотацию @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);
}
}
Работает ли это для вас, или я что-то упустил из вашего вопроса.