TestNG тест наследования и групп - PullRequest
3 голосов
/ 10 октября 2011

У нас есть тесты DAO, которые должны запускаться как на реальном DAO / базе данных, так и на фиктивном дао, чтобы убедиться, что фиктивный дао ведет себя так же, как реальный дао. Для этого у нас есть такая структура:

public abstract class DAOTestBase
{
    public void testSimple()
    {
        // dummy assertion
        assertTrue(true, "Hello");
    }
}


@Test(groups = "fast")
public class TestMockDAO extends DAOTestBase
{
    // setUp/tearDown and helper methods for mock
}


@Test(groups = "slow")
public class TestDAO extends DAOTestBase
{
    // setUp/tearDown and helper methods for real DB
}

К сожалению, это не работает - TestNG не считает, что метод testSimple является тестом, и, следовательно, не будет его запускать. Поэтому вместо этого я попытался аннотировать метод testSimple (или класс DAOTestBase):

  • Примечание * A @Test без каких-либо групп приведет к тому же эффекту - тест не будет выполняться ни для групп fast, ни для slow.

  • Аннотация @Test с группами fast и slow приведет к противоположному эффекту - и TestMockDAO, и TestDAO будут выполняться независимо от того, должны ли выполняться только быстрые или только медленные тесты .

  • A @Test аннотация с другой группой, скажем common, плюс добавленные dependsOnGroups="common" аннотации как в TestMockDAO, так и TestDAO также не будут работать, если common не включен в группы для запуск, который снова приводит к описанному выше случаю 2 (выполняются и TestMockDAO, и TestDAO).

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

Ответы [ 4 ]

2 голосов
/ 09 октября 2012

В настоящее время я работаю в подобной ситуации.

Один из способов запустить тестовые случаи - использовать что-то вроде:

@Test
public void someTest() {
  TestNG testng = new TestNG();
  testng.setTestClasses(new Class[] { SomeTests.class });
  testng.run();
}

* К сожалению, в настоящее время я не могу заставить его сообщать о тестовых случаях в SomeTests .

1 голос
/ 26 сентября 2018

Я использую версию TestNG 6.14.3 и нашел решение, используя аннотацию priority.

Пример:

  1. У меня есть базовый класс тестирования:

    public class TestBase {    
       @Test(priority = 0)
       public void testA()  {        
           assertTrue(true, "testA");
       }
    }
    
  2. И еще один расширенный класс тестирования:

    public class Test2 extends TestBase {
       @Test(priority = 1)
       public void testB() {        
           assertTrue(true, "testB");
       }
    

    }

  3. Когда я запускаю Test2 класс тестированияЯ получаю следующий результат:

    testA: true
    testB: true
    
1 голос
/ 10 октября 2011

Вы пробовали просто добавить аннотацию @Test поверх DAOTestBase? Каждый подкласс переопределит его своей собственной группой, и это должно сделать метод в базовом методе тестирования.

0 голосов
/ 15 ноября 2016

Я решил это следующим образом:

Методы в базовом классе находятся в «базовой» группе, но необходимо проверить, был ли тест инициализирован.

public abstract DaoTestBase {
    private boolean initialized = false;

    @Test(groups = "base")
    public void testSimple() {
        if (!initialized) { return; }

        // dummy assertion
        assertTrue(true, "Hello");
    }
}

Тестинициализируется в дочернем элементе в аннотированном методе BeforeClass.

@BeforeClass
protected void initialize() {
    super.initialized = true;
}

Если вы аннотируете родительский класс вместо методов, вы должны передать значение атрибута attribute_Groups = false и группу, поскольку она наследует также группу базового класса и не будет работать.1010 * Теперь вы должны запустить TestNG, чтобы проверить группы базовые, быстрые или базовые, медленные.Оба теста будут выполнены, но тот, который не инициализирован, ничего не сделает.

Это уродливо, и я бы не рекомендовал его (выглядит лучше переопределить методы в child и вызвать соответствующий супер метод), нов моем случае мне нужны приоритеты в моих методах тестирования, и я хочу избежать этого повторения в каждом дочернем классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...