Parallel processing TestNG listener,如何让测试使用单例
我们使用TestNG侦听器特性在外部工具中报告测试结果。它很好用 但是现在,我们想添加一个由singleton(ThreadLocalWebDriver)包含的信息。我们的测试活动是并行运行的,因此我们有多个singleton实例 例如,我们如何在onSuccess方法中获得正确的单例并报告正确的信息 编辑:代码示例Parallel processing TestNG listener,如何让测试使用单例,parallel-processing,testng,Parallel Processing,Testng,我们使用TestNG侦听器特性在外部工具中报告测试结果。它很好用 但是现在,我们想添加一个由singleton(ThreadLocalWebDriver)包含的信息。我们的测试活动是并行运行的,因此我们有多个singleton实例 例如,我们如何在onSuccess方法中获得正确的单例并报告正确的信息 编辑:代码示例 公共类QTestWrapper实现ISuiteListener、ITestListener{ ... @凌驾 公共void onTestSuccess(ITestResult结果)
公共类QTestWrapper实现ISuiteListener、ITestListener{
...
@凌驾
公共void onTestSuccess(ITestResult结果){
字符串sessionId=MyDriver.getSessionId();
//使用此会话id执行我的工作
}
...
}
公共末班司机{
私有静态最终线程本地MY_驱动程序=
ThreadLocal.withInitial(MyDriver::buildDriver);
私有网络驱动程序;
私有MyDriver(WebDriver){
this.driver=driver;
}
公共静态MyDriver getDriver(){
返回我的_驱动程序。获取();
}
私有静态MyDriver buildDriver(){
URL remoteAddress=getHubAddress();
DesiredCapabilities=buildCapabilities();
WebDriver driver=新的RemoteWebDriver(remoteAddress,caps);
返回新的MyDriver(驱动程序);
}
公共静态字符串getSessionId(){
字符串sessionId=null;
MyDriver-driver=MY_-driver.get();
if(driver!=null&&driver.getWrappedDriver()!=null){
WebDriver wrappedDriver=driver.getWrappedDriver();
sessionId=((RemoteWebDriver)wrappedDriver.getSessionId().toString();
}
返回会话ID;
}
公共WebDriver getWrappedDriver(){
返回驱动器;
}
}
公共类TestLogin{
@AfterMethod(alwaysRun=true)
公共空间(){
StickyDriver.quit();
}
@测试(description=“检查用户是否可以使用管理员配置文件登录。”)
public void loginAsManager(){
演员=新演员(“foo”);
字符串userName=actor.openBrowserAndLogin().getUserName();
资产(用户名)。isEqualTo(“foo”);
}
}
公共级演员{
私有静态最终记录器Logger=LogManager.getLogger();
私家车司机;
私人用户;
公共参与者(字符串用户名){
user=user.getUser(用户名);
driver=MyDriver.getDriver();
}
公共参与者(用户){
this.user=Objects.requirennull(用户);
driver=MyDriver.getDriver();
}
公共主页openBrowserAndLogin(){
openBrowser();
返回登录名();
}
公众网页登入(){
LoginPage LoginPage=新的LoginPage(驱动程序);
loginPage.getUserNameField().setValue(user.getUsername());
loginPage.getPasswordField().setValue(user.getPassword());
返回loginPage.login();
}
私有void openBrowser(){
字符串url=EnvironmentHelper.getUrl();
WebDriver WebDriver=driver.getWrappedDriver();
webDriver.get(url);
试一试{
新WebDriverWait(webDriver,60).until(AjaxExpectedConditions.callsHaveCompleted());
}捕获(TimeoutException例外){
closeBrowser();
掷骰子;
}
}
公共浏览器(){
MyDriver.quit();
}
}
TestNG不保证在同一线程中执行@Test
和onSuccess()
只有在使用org.testng.IInvokedMethodListener
实现时,才能提供这种保证
因此,请更改您的实现以执行以下操作:
- 让你的类
实现QTestWrapper
org.testng.IInvokedMethodListener
- 在
org.testng.IInvokedMethodListener的
中,检查执行的方法是否为afterInvocation()
方法,其状态是否为通过,如果通过,则将@Test
onSuccess()中的逻辑移到其中
beforeInvocation()>@Test>afterInvocation()
提供相同的线程保证。因此,除了这三种方法之外,在构建实现时不应该依赖于threadlocal特定的数据。感谢您的快速回答。