2011-12-26 2 views
2

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

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

Есть ли способ, которым я могу завершить тест, чтобы вызвать мои методы @After*?

+0

Вы не имеете в виду '@ AfterClass' или' @ AfterMethod' для вашей очистки? (@BeforeXXX для * setup *, not * clean up *) – Bohemian

+0

@Bohemian действительно, я имел в виду '@ After' :) спасибо –

ответ

2

Ответ создать выключения крючок с помощью метода addShutdownHookRuntime «s, как это:

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; 
    }   
} 

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

+0

TestNG позволяет использовать нестатический @AfterClass (и я использую этот), поэтому я буду должен передать экземпляр моего тестового класса в Runnable. Также кажется, что в случае успешного выполнения без зависания мой метод '@ After *' будет вызываться дважды - сначала с помощью среды TestNG, затем с помощью hook. Я прав? Как я могу решить эту проблему? –

+0

a) Сделайте свой статичный '@ AfterClass' статическим ... вам разрешено. b) установите в своем методе флаг 'static volatile boolean' и убедитесь, что он не был уже установлен *, прежде чем продолжить - таким образом он выполнит только очистку * один раз * – Bohemian

+0

Я думаю, что вы оба не указали точку , он находится в ситуации, когда один из его тестов блокирует TestNG, и он хочет, чтобы методы After * запускались в любом случае. Если к тому времени вы используете кран отключения, JVM отключается, поэтому очистка в After * никогда не будет выполнена. Я отвечу в отдельном комментарии. –

2

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

@Test(timeOut = 10000) // 10 seconds 
public void f() {...} 
+0

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

+0

Но есть * некоторый * тайм-аут, так как вам нужно решить, когда ваш тест действительно мертв и должен быть прерван, не так ли? Просто используйте это значение в тайм-ауте. –

+0

В некоторых случаях - да, а в некоторых случаях - нет. Для моего функционального теста я использую стандартный вывод для проверки его выполнения. Конечно, я могу добавить тайм-аут с некоторым значением, достаточно большим, чтобы гарантировать, что тест завершится, если не произойдет зависания (так что, если я планирую полную сборку с включенным тестом, она в конечном итоге будет завершена), но мне нужно более точное для ситуаций, когда мне нужно быстро работать с тестом. Я понимаю, что использование тайм-аута - это надежный способ решить проблему повесить трубку, но у нее есть недостаток - ожидание. См. Мои комментарии к ответу Богемиана. –

Смежные вопросы