Parallel processing TestNG listener,如何让测试使用单例

Parallel processing TestNG listener,如何让测试使用单例,parallel-processing,testng,Parallel Processing,Testng,我们使用TestNG侦听器特性在外部工具中报告测试结果。它很好用 但是现在,我们想添加一个由singleton(ThreadLocalWebDriver)包含的信息。我们的测试活动是并行运行的,因此我们有多个singleton实例 例如,我们如何在onSuccess方法中获得正确的单例并报告正确的信息 编辑:代码示例 公共类QTestWrapper实现ISuiteListener、ITestListener{ ... @凌驾 公共void onTestSuccess(ITestResult结果)

我们使用TestNG侦听器特性在外部工具中报告测试结果。它很好用

但是现在,我们想添加一个由singleton(ThreadLocalWebDriver)包含的信息。我们的测试活动是并行运行的,因此我们有多个singleton实例

例如,我们如何在onSuccess方法中获得正确的单例并报告正确的信息

编辑:代码示例

公共类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()中的逻辑移到其中

你能告诉我们你的代码是什么样子(测试类、监听器和你所指的单例)吗?我已经编辑了我的消息。@KrishnanMahadevanThx获得了这些很棒的提示。最后一个问题。如果我在afterInvocation中为一个类成员分配了一个值,那么我能确保在onTestSuccess中获得相同的值(所以是相同的线程)吗?否则我仍然会遇到线程问题?TestNG仅为
beforeInvocation()>@Test>afterInvocation()
提供相同的线程保证。因此,除了这三种方法之外,在构建实现时不应该依赖于threadlocal特定的数据。感谢您的快速回答。