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

时间:2019-04-28 21:45:39

标签: java multithreading automation cucumber browser-automation

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

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

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

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

实际上,我不是Java开发人员,而只是进行自动化测试的质量检查人员,请提出建议,指导如何实现它。

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

getNewUser(userType) =给出一个新用户,如果它为null,但是它不会停止feature2来创建一个供其使用的用户,但是介于执行之间的那个用户也会进入feature1。

1 个答案:

答案 0 :(得分:0)

这听起来不像是线程安全性问题,对我来说,这听起来像您只是想在场景之间共享数据?答案很大程度上取决于您的应用程序以及是否使用依赖项注入...您没有发布运行程序,功能文件,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. 将所有用户全部保留在一张大型静态图中,您的方案可以在其中通过测试ID或浏览器类型等来获取自己的用户。 但这两个选项只是上述主题的变体。