【问题标题】:Create unique user for each test class run executing automation test为执行自动化测试的每个测试类运行创建唯一用户
【发布时间】:2021-07-13 15:23:07
【问题描述】:

我已经使用 Selenium 和 TestNG 为 Web 应用程序实现了并行测试,但是,我的 Web 应用程序有一个限制,即一次只能处理一个会话(当您使用同一用户登录时,它不支持多会话它会断开你的旧会话),我认为解决它的解决方案是为每个测试创建一个唯一用户(使用 API),所以我已经实现了它,但是当我并行运行测试时(使用 testng. xml 文件,thread-count="2") 我创建了同一个用户两次!使用相同的凭据,我希望能够创建一个唯一用户,它将为每次运行创建一个唯一用户。

这是我的代码:

public class BaseApiTest extends BaseTest {
    protected String token;
    protected String CREATED_ADMIN_TEST_USER;
    protected String CREATED_ADMIN_TEST_PASSWORD;
    private static final AtomicReference<String> ACCESS_TOKEN = new AtomicReference<>();

    @BeforeClass(alwaysRun=true)
    public void baseApiSetup() throws InterruptedException, ApiException {
        generateToken();
        createAdminUser();
    }

    private void generateToken() {
        ........
        ..........
        ...........
        token = "Bearer " + ACCESS_TOKEN.get();
        context.setAttribute("api-key", token);
        context.setAttribute("HOST", HOST);
        T_Logger.info("Host url address is: =[{}]", HOST);
        T_Logger.info("new api key token =[{}]", token);
    }

    private void createAdminUser() throws ApiException, InterruptedException {
        UsersAPIUnitTest usersAPITU = new UsersAPIUnitTest(context);
        usersAPITU.createUser();
        CREATED_ADMIN_TEST_USER = UsersAPIUnitTest.getEmail();
        CREATED_ADMIN_TEST_PASSWORD = UsersAPIUnitTest.getPassword();
    }


}

这被新创建用户的登录页面使用:

protected void adminSignIn() {
        loginPage.login(CREATED_ADMIN_TEST_USER, CREATED_ADMIN_TEST_PASSWORD, true);
        writeToLoggerSignIn(CREATED_ADMIN_TEST_USER);
    }

然后我开始运行我的测试。

预期:每个测试类都将包含自己的唯一用户

实际:正在创建的所有用户都是具有相同凭据的同一用户

=========================编辑=============== ================

这就是我创建新用户的方式:

public String createUserCms(String name, String email, String phone, String password) throws ApiException {
        NewUserPayload body = new NewUserPayload();
        body.setStatus(true);
        body.setName(name);
        body.setEmail(email);
        body.setPhone(phone);
        body.setPassword(password);
        body.setPasswordConfirmation(password);
        printBody(body);
        return usersApi.createUser(token, body);
    }

【问题讨论】:

  • 您在哪里调用createUserCms(),并且每次调用此方法时是否传递唯一的nameemail
  • 我从 BaseApiTest 调用的 adminSignIn() 方法调用它,这就是我实现它的方式: public void createUser() throws InterruptedException, ApiException { Thread.sleep(2000); String response = usersAPI.createUserCms(userName, email, phoneNumber, password); Assert.assertEquals(response, "用户创建成功"); System.out.println(响应); // T_Logger.info("用户=[{}]创建成功,密码=[{}]", userName, password); }
  • 至于传递用户名和密码,我使用的是创建令牌的同一个用户,我可以进一步使用它来创建一个新用户,所以实际上我一次又一次地使用同一个用户,这个user 正在创建各种唯一用户。
  • 知道了! UsersAPIUnitTest.getEmail()这个方法是返回新用户吗?
  • 要为用户获取新创建的电子邮件,但是是的,这是我的用户名,我可以使用此电子邮件登录。

标签: java api selenium testng ui-automation


【解决方案1】:

我一直在为这个问题制定一个通用的解决方案,以便所有自动化团队都可以使用它,并且仍在进行中。我相信您会探索其他选项,但是每次运行测试时创建用户并不是一个好主意,而是您必须创建一次用户并使用它们,否则您最终会在系统中添加更多用户(如果您正在清理用户@afterMethod 很好)

但是现在,就您而言,您必须确保在创建用户时传递一个唯一的名称/电子邮件并返回该用户名/电子邮件地址。

如果您可以分享您的 createUser 方法 sn-p,我们可以为您提供更多帮助。

【讨论】:

  • 是的,当然我会把它添加到我的问题中,一般我使用swagger来实现我的用户的创建(它是用于创建新用户的webapp内部API),我将它放在编辑下,顺便说一句,我确实计划在测试完成后删除每个唯一用户
猜你喜欢
  • 2020-02-29
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
相关资源
最近更新 更多