Как изящно завершить тест TestNG? - PullRequest
3 голосов
/ 26 декабря 2011

Некоторые из моих тестов TestNG связаны с постоянным использованием данных.После завершения теста необходимо выполнить некоторые действия для восстановления состояния данных (например, очистка).Я решаю это, используя @AfterClass или @AfterMethod.

Проблема в том, что иногда во время разработки мой тест зависает, и мне нужно завершить его вручную.При завершении тестирования процесса JVM я должен выполнить все пост-тестовые действия самостоятельно.

Можно ли как-нибудь прекратить тест, чтобы вызывать мои @After* методы?

Ответы [ 2 ]

3 голосов
/ 26 декабря 2011

Ответ заключается в создании ловушки отключения с помощью Runtime addShutdownHook, например, так:

static volatile boolean cleanedUp = false;
static final Object lock = new Object();

@BeforeClass
public static void setup() {
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        public void run() {
            MyTestClass.tearDown();
        }
    }
}

@AfterClass
public static void tearDown() {
    synchronized (lock) {
        if (cleanedUp) return;
        // do clean up
        cleanedUp = true; 
    }         
}

Использование синхронизации гарантирует, что очистка выполняется только один раз.

2 голосов
/ 27 декабря 2011

Если вы хотите, чтобы TestNG продолжал работу, даже если у вас есть тесты, которые блокируются, вы можете установить тайм-аут для этих тестов, чтобы TestNG убил их через определенный промежуток времени. После этого вы должны вызывать методы After * как обычно:

@Test(timeOut = 10000) // 10 seconds
public void f() {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...