Могу ли я указать группу всего класса в тестовом примере 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 это не представляется возможным. У кого-нибудь есть другие идеи?


person Mike Stone    schedule 12.08.2008    source источник
comment
Только что добавил возможное решение вашей проблемы «общеклассной группы» TestNG. Не могли бы вы проверить это и сказать мне, идет ли это в правильном направлении?   -  person VonC    schedule 09.11.2008


Ответы (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 (и довольно много внутренних классов)
  • скопируйте и вставьте класс в каталог «исходный/тестовый» (поскольку пакет является «тестовым»)
  • запустить его (без аргументов)

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

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

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

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

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

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

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

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

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

person VonC    schedule 08.11.2008
comment
Извините, что так долго... Я как бы перестал смотреть ТАК на некоторое время :-) - person Mike Stone; 16.03.2009
comment
Майк!!! Майк Стоун вернулся! Рад, что вам понравилось мое решение: это была одна из моих первых задач на SO;) - person VonC; 16.03.2009
comment
Модифицировать сборку? Вы модифицируете сборку Testng? Поскольку сложность моего решения заключается именно в том, чтобы избежать модификации Testng... - person VonC; 16.03.2009

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

person Alejandro Bologna    schedule 16.09.2008

Мне кажется, что это выглядит следующим образом code-challenge (сообщение сообщества на вики):

Как иметь возможность выполнять все тестовые методы класса Extended из группы '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");
        }
    }
person Community    schedule 08.11.2008

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

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

person Sam Merrell    schedule 12.08.2008

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

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

person Jorge Ferreira    schedule 30.09.2008