我的一些TestNG测试涉及持久数据使用。测试完成后,应执行一些操作以恢复数据状态(例如清理)。我使用@AfterClass
或@AfterMethod
来解决此问题。
问题是,有时在开发过程中我的测试会挂断,我需要手动终止它。当终止JVM进程运行测试时,我必须自己执行所有的测试后操作。
有没有办法可以终止测试,以便调用我的@After*
方法?
答案 0 :(得分:3)
答案是通过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;
}
}
使用同步可确保清理仅执行一次。
答案 1 :(得分:2)
如果你想让TestNG继续进行即使你有锁定的测试,你也可以在这些测试上花些时间,这样TestNG会在一段时间后杀死它们。在此之后,你应该像往常一样调用After *方法:
@Test(timeOut = 10000) // 10 seconds
public void f() {...}