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

голоса
11

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

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

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

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

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

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

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

Задан 12/08/2008 в 17:52
источник пользователем
На других языках...                            


5 ответов

голоса
2

Ответ через пользовательский org.testng.IMethodSelector :

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

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

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

НО , что -testrunfactory никогда не принимается во внимание TestNG класса ... так что вам нужно также определить пользовательский класс TestNG:

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

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

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

Как обычно для кода вызова:

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

Обновление от Mike Stone:

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

В принципе, я создал аннотацию групп, который ведет себя как собственность группы испытания (и другие) аннотаций.

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

Изменить сборку использовать новую аннотацию трансформатор, и все это прекрасно работает!

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

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

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

И я сделал трансформаторную работу с подклассов и все.

Ответил 09/11/2008 в 00:12
источник пользователем

голоса
2

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

Ответил 16/09/2008 в 19:06
источник пользователем

голоса
1

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

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

  • указав группу «aGlobalGroup» на самом расширенном классе?
  • тестирование не аннотированный общие методы расширенного класса?

Первый ответ прост:
добавить класс TestNG (группы = { «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");
        }
    }
Ответил 08/11/2008 в 23:57
источник пользователем

голоса
1

Я не знаю , как аннотация работает наследование для TestNG , но эта статья может быть полезным. http://beust.com/weblog/archives/000170.html .

На самом деле, это может помочь лучше http://testng.org/doc/documentation-main.html#annotations , посмотрите на inheritGroups.

Ответил 12/08/2008 в 20:03
источник пользователем

голоса
0

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

Означает ли это работает для вас, или я что-то из вашего вопроса не хватает.

Ответил 30/09/2008 в 18:23
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more