0

我想使用 Cypress 来实现自动化。

我们的系统要求用户登录并执行某些操作。我遇到的问题是,当我创建不同的测试用例时,用户会被注销,我必须重新使用某些我不想使用的代码,因为这是不好的做法。

如何使用相同的状态,以便用户在整个会话中都登录并且测试用例将流动而无需为每个会话登录。

4

1 回答 1

0

我的第一个问题是如何实现登录功能?你没有提到这一点,但这是在这里提出任何行动方案的关键。

因此,我只能猜测。我将分享一个示例,您可以尝试根据自己的情况对其进行调整,看看它是否有效。

在我测试的应用程序中,我可以通过 API 登录,即/users/login在正文中调用带有凭据的 POST 端点。除此之外,我还必须在 Authorization 标头中提供 API 密钥。我可以准备一个赛普拉斯自定义命令来执行此操作:

Cypress.Commands.add('apiLogin', ({ email, password }) => {
  cy
    .request({
      method: 'POST',
      url: `${Cypress.env('apiBaseUrl')}/users/login`,
      body: {
          email: email,
          password: password
      },
      headers: {
          Authorization: `ApiKey ${Cypress.env('apiKey')}`
      }
    });
});

然后在我的测试中的任何地方,我都可以使用它来登录:

cy
  .fixture('credentials')
  .then(user => {
    cy
      .apiLogin(user);
  });

好的,但是请求返回了什么?

在我的例子中,请求返回一个刷新令牌和访问令牌。如果我将它们设置在 cookie 中,则我已登录:

cy
  .fixture('credentials')
  .then(users => {
    cy
      .apiLogin(users.confirmed)
      .then(res => {
        cy
          .setCookie('AUTH_TOKEN', res.body.accessToken)
          .setCookie('REF_TOKEN', res.body.refreshToken);
      });
  });

把它放在钩子之前的一个好地方:

before(() => {
  cy
    .fixture('credentials')
    .then(user => {
      cy
        .apiLogin(user)
        .then(res => {
          cy
            .setCookie('AUTH_TOKEN', res.body.accessToken)
            .setCookie('REF_TOKEN', res.body.refreshToken);
        });
  });
});

并且要在同一个描述块中的多个测试中使用相同的令牌,我需要告诉赛普拉斯保留 cookie:

beforeEach(() => {
  Cypress.Cookies.preserveOnce('AUTH_TOKEN', 'REF_TOKEN');
});

我不知道这样的东西是否适用于您的系统。但它可以作为如何登录测试的一般思路,即:

  • 使用 API 是个好主意,它比使用 UI 更快
  • 用户是否登录可以由一个或多个 cookie 控制
  • 赛普拉斯可以保存 cookie

一些进一步研究的链接:

一般来说,在深入编写一些自动化程序之前,有必要了解您的系统是如何工作的。

于 2021-11-18T10:07:04.117 回答