java - 并行自动化测试和线程安全变量

标签 java multithreading automation cucumber browser-automation

我正在并行运行自动化测试。不同的功能文件在专用的不同浏览器上运行。

在自动化测试过程中,每个线程中都会创建多个测试用户(5 个功能有 5 个浏览器)。

问题是 1 个功能创建了一个用户 = dave+timestamp 另一个创建的 dave+new-timestamp。一个功能文件在其执行过程中必须仅使用用户,但它使用由另一功能(线程)创建的另一个用户。

我认为我需要使这些用户线程安全,以便每个功能(线程)可以使用 1 个用户。

实际上,我不是一个java开发人员,只是一个做自动化测试的QA,请建议,指导我如何实现它。

这就是我传递新用户提交注册表单的方式。 endUser.doRegistration(getNewUser(userType));

getNewUser(userType) = 如果为 null,则提供一个新用户,但它不会停止 feature2 创建一个用户供其使用,但在执行之间该用户也会进入 feature1。

最佳答案

这听起来不像是线程安全问题,在我看来,您只是想在场景之间共享数据?答案很大程度上取决于您的应用程序以及您是否使用依赖项注入(inject)...您没有发布您的运行程序、功能文件、stepdef 或有关依赖项的任何信息,因此这里的帮助将相对有限...

最简单的答案是创建一个包含用户的类。 像这样的东西可能有用吗?

public class UserManager(){
private static User user;

public static User getUser(){
 if(user == null){
   //create your user here... Dave + Timestamp or whatever your user logic is
   user = new User();
  }
 return user;
 }
}

那么每个步骤 def 需要包含一个类似的步骤 `然后获取用户'

因为这里的用户对象是静态的,所以任何需要用户的stepdef都只需调用UserManager.getUser()来获取用户,您将为每个步骤返回相同的用户实例.

如果需要在测试之间进行,您可以选择在 userManager 类中定义方法来重置用户等。

现在..如果您确实遇到用户数据跨越线程边界的问题..那么您有两个选择。

  1. 使用线程本地存储来存储用户对象。这是指南:https://www.baeldung.com/java-threadlocal

  2. 将所有用户都保留在一个大型静态 map 中,您的场景可以通过测试 ID 或浏览器类型等获取自己的用户。 不过,这两个选项都只是上述主题的变体..

关于java - 并行自动化测试和线程安全变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55894843/

相关文章:

python - Firefox WebDriver 处理 "Download"窗口

java - 为什么新线程内 getPriority 的优先级与调用线程中的优先级不同?

ruby - `loop{}` 与 `loop{sleep 1}`

java - 在使用 k8s 部署应用程序时在本地测试应用程序代码

java - 如何使用 Oracle Forms 将 CSV 列值插入 block 和表中?

c++ - 段错误 : 11 while using boost mutex

excel - 是否可以通过 COM 将图像插入到 excel 单元格中?

java - 我如何知道我通过java连接的路由器端口

java - 不是 "unsafe operation"错误 : Incompatible types Object cannot be converted to Entry<String, boolean 值>

java - 如何让 Cobertura 因低代码覆盖率而使 M2 构建失败