我正在编写一个TestNG程序,我想在执行测试之前执行一些操作。基本上,我想在测试开始之前执行.bat
文件。在.bat文件中,我正在执行一些软件的安装和卸载。这是我在@BeforeSuit
@BeforeSuite
public void beforeSuite() {
try {
String[] command = {"cmd.exe", "/C", "Start", "C:\\Users\\adutta\\Desktop\\uninstal-install.bat"};
Process p = Runtime.getRuntime().exec(command);
p.waitFor();
} catch (IOException ex) {
System.out.println(ex);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我有2个问题。
我想暂停程序执行,直到批处理文件没有完全执行。
执行批处理文件时,它没有以预期的方式执行。批处理文件将首先检查是否已安装该软件,如果已安装,则将首先将其卸载,然后再次安装。但是,如果已经安装了该软件,则它将先运行安装代码,然后再运行卸载代码,因此,该软件将在执行结束时被卸载。是的,由于卸载需要花费一些时间,其余的Java代码不会等待相同的时间,而是同时执行,这是不希望的。我想在批处理文件执行时暂停执行。只是第一个问题。
这是我的批处理文件的内容-
@echo off
if exist "C:\Program Files (x86)\Host Analytics\SpotlightXL" (
GOTO UNINSTALL
) else (
GOTO INSTALL
)
:UNINSTALL
CALL C:\Users\adutta\Desktop\uninstall.bat
GOTO INSTALL
:INSTALL
CALL C:\Users\adutta\Desktop\install.bat
exit
我该如何解决这些问题?有什么解决办法或建议吗?
答案 0 :(得分:0)
问题出在我的批处理文件中。根据设计,TestNG将等待配置方法运行完成,然后再继续执行其他配置方法或测试方法。 TestNG在那里没有尝试任何并行性。
您需要确保您的批处理文件具有适当的等待/睡眠机制,以确保仅在该批处理文件中编写的所有活动运行完毕后才返回。
在您的@BeforeSuite
方法中,您需要添加适当的轮询逻辑,以等待活动完成然后继续进行。
当前,从您的代码来看,p.waitFor();
会立即返回,这说明了为什么@BeforeSuite
方法在完成软件安装/卸载活动之前就退出了。