如何优雅地终止TestNG测试?

时间:2011-12-26 07:57:57

标签: java testng

我的一些TestNG测试涉及持久数据使用。测试完成后,应执行一些操作以恢复数据状态(例如清理)。我使用@AfterClass@AfterMethod来解决此问题。

问题是,有时在开发过程中我的测试会挂断,我需要手动终止它。当终止JVM进程运行测试时,我必须自己执行所有的测试后操作。

有没有办法可以终止测试,以便调用我的@After*方法?

2 个答案:

答案 0 :(得分:3)

答案是通过RuntimeaddShutdownHook方法创建关闭挂钩,如下所示:

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() {...}