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

StackOverflow https://stackoverflow.com/questions/9044

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

Ответ через кастом org.testng.IMethodSelector:

Его включитьМетод() может исключить любой метод, который мы хотим, например общедоступный метод без аннотаций.

Однако для регистрации пользовательского Джава MethodSelector, вы должны добавить его в XMLTest экземпляр, управляемый любым TestRunner, а это значит, что вам нужен собственный пользовательский TestRunner.

Но чтобы создать собственный TestRunner, вам необходимо зарегистрировать TestRunnerFactory, сквозь -testrunfactory вариант.

НО это -testrunfactory НИКОГДА не учитывается ТестНГ сорт...поэтому вам также необходимо определить собственный класс TestNG:

  • чтобы переопределить метод configure(Map),
  • так что вы действительно можете установить TestRunnerFactory
  • TestRunnerFactory, которая создаст для вас собственный TestRunner,
  • TestRunner, который установит для экземпляра XMLTest собственный XMLMethodSelector.
  • XMLMethodSelector, который создаст собственный IMethodSelector.
  • IMethodSelector, который исключит любые методы TestNG по вашему выбору!

Хорошо...это кошмар.Но это еще и вызов кода, так что это должно быть немного сложно;)

Весь код доступен по адресу Фрагменты DZone.

Как обычно для проверки кода:

  • один класс Java (и немало внутренних классов)
  • скопируйте и вставьте класс в каталог «источник/тест» (поскольку пакет является «тестовым»)
  • запустите его (аргументы не нужны)

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

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

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

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

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

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

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

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

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

Другие советы

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

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

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

Я не уверен, как наследование аннотаций работает для 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);
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top