我正在并行运行自动化测试。不同的功能文件在专用的不同浏览器上运行。
在自动化测试过程中,每个线程中都会创建多个测试用户(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 类中定义方法来重置用户等。
现在..如果您确实遇到用户数据跨越线程边界的问题..那么您有两个选择。
使用线程本地存储来存储用户对象。这是指南:https://www.baeldung.com/java-threadlocal
将所有用户都保留在一个大型静态 map 中,您的场景可以通过测试 ID 或浏览器类型等获取自己的用户。 不过,这两个选项都只是上述主题的变体..
关于java - 并行自动化测试和线程安全变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55894843/