TestNG: Определение следующих методов тестирования

Моя цель - очистить() мой javax.persistence.EntityManager после каждого метода тестирования.

Вот пример тестового класса:

public class Example
{
    @Test(dataProvider = "sampleDataProvider")
    public void testA(String parameter)
    {
        System.out.println(parameter);
    }

    @Test(dataProvider = "sampleDataProvider")
    public void testB(String parameter)
    {
        System.out.println(parameter);
    }
}

EntityManager используется в dataProvider "sampleDataProvider" путем запроса к базе данных тестовых данных, которые затем компилируются в следующем формате: new Object[2][1]. Имейте в виду, что запросы и компиляция данных выполняются до фактического запуска тестового метода (с аннотацией @DataProvider), и что мы фактически запрашиваем сущности, а не только строки.

Приведенный выше тестовый класс будет работать так:

testA("some queried entity 1")
testA("some queried entity 2")
testB("some queried entity 1")
testB("some queried entity 2")

Моим первоначальным решением было использовать аннотацию @AfterTest для очистки entityManager. Однако он отсоединит "some queried entity 2" от entityManager до второго запуска (или второго тестового экземпляра) testA и testB, что вызовет проблемы при операциях чтения/записи для членов "some queried entity 2".

Моя цель — очистить entityManager после тестового метода, а не обязательно после каждого экземпляра тестового метода.

Позволяет ли TestNG узнать, какой тест будет запущен дальше? Таким образом, я мог бы легко очистить entityManager, если следующий тест будет новым.

Любые другие рекомендации?


person Jan Julian    schedule 18.01.2011    source источник


Ответы (1)


Я не знаю ни одного простого способа получить следующий метод тестирования. Кстати, вы можете добиться того же результата, используя аннотацию @AfterGroups:

@Test(groups = {"groupA"})
public void testA(...) { ... }

@Test(groups = {"groupB"})
public void testB(...) { ... }

@AfterGroups(groups = {"groupA"})
public void afterGroupA() {
    // clear entity manager here
}

Обратите внимание, что порядок запуска тестов не гарантируется TestNG, пока вы не укажете его явно с помощью параметров dependOnMethods или dependOnGroups аннотации @Test или атрибута «preserve-order» тега в файле testng.xml.

ОБНОВЛЕНИЕ

В качестве альтернативы вы можете использовать свой собственный TestListener. Вы можете реализовать метод onTestStart(). , который будет делать очистку, если это необходимо. AFAIU, вызванный тестовый метод доступен в частично заполненном ITestResult. Кстати, будьте осторожны - это может привести к проблемам, вызванным неявной тестовой логикой (очистка не будет видна из тестового кода).

person Kel    schedule 18.01.2011
comment
Спасибо. Я думал об этом. Однако у нас огромное количество тестов и датапровайдеров, и сгруппировать их все — очень сложная задача. Я понимаю, что TestNG запускает тесты в случайном порядке, но у него должен быть какой-то механизм получения следующего метода (случайного) для его запуска. Я думаю переопределить его и просто добавить туда EM.clear(). - person Jan Julian; 18.01.2011
comment
Затем вы можете реализовать TestListener - см. обновление в ответе. - person Kel; 18.01.2011
comment
Спасибо! Это хорошее начало. Я посмотрю, куда я могу пойти от этого, и любые проблемы, которые могут возникнуть. - person Jan Julian; 18.01.2011
comment
В качестве альтернативы вы можете использовать метод, аналогичный описанному в этом сообщении: beust.com/weblog/2010/03/23/better-mock-testing-with-testng - person Cedric Beust; 18.01.2011