Могу ли я указать группу в классе для теста TestNG?

У меня есть базовый класс, который представляет тест базы данных в TestNG, и я хочу указать, что все классы, выходящие из этого класса, относятся к группе «db-test», однако я обнаружил, что это кажется невозможным. Я пробовал аннотацию @Test:

@Test(groups = { "db-test" })
public class DBTestBase {
}

Однако это не работает, потому что аннотация @Test будет пытаться превратить несколько методов в тесты, и предупреждения / ошибки будут появляться в затмении при запуске тестов.

Поэтому я попытался отключить тест, поэтому по крайней мере группы назначены:

@Test(enabled = false, groups = { "db-test" })
public class DBTestBase {
}

но тогда любой @BeforeTest (и другие подобные аннотации) ТАКЖЕ отключается ... что, конечно, не то, что я хочу.

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

12.08.2008 16:52:08
Только что добавили возможное решение проблемы TestNG «общеклассная группа». Не могли бы вы проверить это и сказать мне, если это идет в правильном направлении?
VonC 8.11.2008 23:31:39
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»)
  • запустить его (аргументы не нужны)

Обновление от Майка Стоуна:

Я собираюсь принять это, потому что это звучит довольно близко к тому, что я в конечном итоге делал, но я решил, что добавлю и то, что сделал.

По сути, я создал аннотацию Groups, которая ведет себя как свойство groups аннотаций Test (и других).

Затем я создал GroupsAnnotationTransformer, который использует IAnnotationTransformer для просмотра всех тестов и определяемых классов тестов, а затем модифицировал тест для добавления групп, что прекрасно работает с исключением и включением групп.

Измените сборку, чтобы использовать новый преобразователь аннотаций, и все работает отлично!

Хорошо ... Единственное предостережение в том, что он не добавляет группы к не тестовым методам ... потому что в то время, когда я делал это, был еще один преобразователь аннотаций, который позволяет преобразовывать НИЧЕГО, но он как-то не был включен в TestNG я использовал по какой-то причине ... так что это хорошая идея сделать ваши методы до / после аннотированными всегдаRun = true ... что мне достаточно.

Конечный результат я могу сделать:

@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
    @Test
    @Groups("aMethodLevelGroup")
    public void myTest() {
    }
}

И я заставил трансформатор работать с подклассами и всем остальным.

2
16.03.2009 18:31:06
Извините, что так долго ... Я вроде перестал смотреть ТАК на некоторое время :-)
Mike Stone 16.03.2009 18:31:34
Майк!!! Майк Стоун вернулся! Рад, что вам понравилось мое «решение»: это был один из моих первых вызовов кода на SO;)
VonC 16.03.2009 18:33:56
"Изменить сборку"? Вы модифицируете Testng билд? Потому что сложность моего решения заключается именно в том, чтобы избежать изменения Testng ...
VonC 16.03.2009 18:45:59

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

На самом деле, это может помочь лучше , посмотрите на inheritGroups.

1
1.08.2018 16:02:03

TestNG будет запускать все открытые методы из класса с аннотацией @Test. Возможно, вы могли бы изменить методы, которые вы не хотите, чтобы TestNG запускал, чтобы быть закрытыми

4
16.09.2008 18:06:40

Вы можете указать аннотацию @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);
    }
}

Это работает для вас, или я что-то упустил из вашего вопроса.

0
30.09.2008 17:23:10

Это может показаться мне следующим вызовом кода (пост вики-сообщества):

Как быть в состоянии выполнить все методы тестирования расширенного класса из группы «aGlobalGroup» без:

  • указание группы 'aGlobalGroup' на самом расширенном классе?
  • тестирование открытых аннотированных методов класса Extended?

Первый ответ прост:
добавьте класс 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");
        }
    }
1
8.11.2008 22:57:34