java - 传递一个运行多个不同线程的静态变量 - TestNG
问题描述
我正在使用 TestNG 以使用 Appium 并行运行自动化移动测试。
我在一个类中有一个方法可以启动一个 AppiumDriver 对象。
我从我的 TestNG 类中调用此方法,以便每个线程创建它自己的驱动程序实例。麻烦的是,因为它是一个静态变量,当每个线程尝试通过静态方法从另一个类访问驱动程序时:
总是存在冲突,因为每个线程只能访问 AppiumDriver 对象的单个实现。
我知道我可以通过将所有这些代码放在 TestNG XML 文件与之通信的单个类中来绕过这一点,但这很混乱,我更愿意为不同的功能部分使用单独的类。
例如,我有一个自定义的 TestNG 侦听器,我想在每个测试方法运行后打印每个线程正在使用的驱动程序详细信息。使用以下方法:
但是,这总是打印最后一个运行线程的驱动程序。
我该如何确保从该method is consistent to the driver that was created in the
方法返回的驱动程序?
解决方案
如果您正在并行运行测试,那么我们需要使用非静态方法来避免冲突。以上所有方法都需要更改为非静态方法。
您需要如下修改您的侦听器类,它将正确地提供驱动程序详细信息。我们需要从ITestResult
监听代码:
public class ResultsListener implements ISuiteListener, IInvokedMethodListener {
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
Object currentClass=testResult.getInstance();
WebDriver driver = ((AppiumSetUp) currentClass).getDriver();
System.out.println("Driver details: " + driver);
}
}
编辑:
您可以在所有必需的类中扩展 AppiumSetUp 类(至少在 @BeforeTest 方法类中)。因此,您可以直接访问 setup 方法,如下所示。出于示例目的,我将类名添加为BeforeTestSetup
public class BeforeTestSetup extends AppiumSetUp{
@BeforeTest(alwaysRun = true)
@Parameters({"platform", "udid", "chromeDriverPort", "chromeDriverPath", "deviceName"})
public void setUp(String platform, String udid, String chromeDriverPort, @Optional String chromeDriverPath, String deviceName) throws Exception {
driver = setUp(platform, udid, chromeDriverPort, deviceName);
}
}
推荐阅读
- nswagstudio - 更改 NSwagStudio 序列化设置以允许 Nulls
- javascript - 如何在 React js 中使用 jQuery/javascript 文件进行设计
- rasa-nlu - 有没有小鸭的替代品?
- javascript - 字体在 iOS 的 Cordova 应用程序上随机加载
- docker - 如何监控容器内运行的进程
- asp.net - 为什么 Gridview 在单击按钮时会丢失 BackColor
- firebase - Firebase - 查看特定页面的所有内容
- zabbix - zabbix - 安装多个ezbbix代理版本
- docusignapi - DocuSign 返回 URL
- project-reactor - Reactor Netty 中的 ByteBuf 分配器