如何优雅地终止 TestNG 测试?

pav*_*lou 5 java testng

我的一些 TestNG 测试涉及持久数据使用。当测试完成时,应该执行一些操作来恢复数据的状态(例如清理)。我使用@AfterClassor解决了这个问题@AfterMethod

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

有什么方法可以终止测试以便@After*调用我的方法吗?

Boh*_*ian 4

答案是通过的方法创建一个关闭钩子 ,如下所示: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; 
    }         
}
Run Code Online (Sandbox Code Playgroud)

使用同步可确保清理仅执行一次。