Cypress Typescript:如何存储可在 afterEach 拆解中使用的变量?

Cypress Typescript: how to store a variable that can be used in the afterEach teardown?

我有一些测试用例,它们在开始时将数据存储在一个变量中,以便在整个测试过程中使用。它在测试期间工作正常,并且可以在拆解之前调用到测试的最后一步,但是当我尝试在 @afterEach 拆解中使用它时 运行s 在每个结束时测试执行任何全局清理命令,变量显示为空并且不再存储任何内容。变量似乎被意外重置了。

我想在拆解中 运行 它的原因是确保即使测试用例在完成到最后之前失败,也可以访问存储的数据(从而确保在拆解中收集数据).我怎样才能让变量正确存储到赛普拉斯测试的拆解中?

我试过在 class 中使用静态变量,但这似乎不起作用。

在每个测试用例期间,一个方法存储用户的数据并将其锁定在会话中,因此在从会话中释放之前,它不能被其他测试运行并行使用。

class myUser {
  static user;

  public setUser(params: object): void {
    myUser.user = setAndLockUser(params);
  }

  public releaseLockedUser(): void {
    if (myUser.user == undefined) return;
    releaseTheUserLock(myUser.user);
  }
}

在测试用例结束时,我想确保删除用户的会话,以便用户不再被锁定在会话中,并且可以用于尚未 运行 的测试用例。所以我们在afterEach方法中添加releaseUser

afterEach(() => {
  myUser.releaseLockedUser();
});

这里遇到存储变量不被识别的问题。整个测试过程中,user变量存储成功,但是在afterEach teardown过程中变量为空,无法正确清除session

请阅读Using after or afterEach hooks

Anti-Pattern: Using after or afterEach hooks to clean up state.

如果测试用例在完成前失败

,则同样适用于状态的任何使用

你为什么不提供一个明确的例子来说明你想做什么,也许可以提供一个替代方案。


按照 Cypress 给出的指南,您将在 beforeEach() 中执行 releaseLockedUser() 而不是在 afterEach() 中执行,如果测试失败则可能不会调用。

这样每个测试都会看到一个干净的静态用户值。

您可以将您的值存储在 Cypress 环境变量中并在 afterEach() 中重置状态。 请继续阅读此代码示例

class myUser {
  public setUser(params: object): void {
    Cypress.env('user', setAndLockUser(params);
  }

  public releaseLockedUser(): void {
    if (Cypress.env('user') {
      releaseTheUserLock(Cypress.env('user'));
    }
  }
}
...
afterEach(() => {
  /**
   * the `.then()` may not be necessary or feasible, but using to show 
   * how you should be careful to clear the environment variable after
   * you're sure that you've released your locked user.
   */
  myUser.releaseLockedUser().then(() => {
    Cypress.env('user', undefined);
  });
});

虽然 Fody 引用的文章直接来自 Cypress,并且确实提出了一些令人信服的观点,但我仍然相信 afterafterEach 有计划使用的地方。尽可能使用 beforebeforeEach 哪个更好?绝对地。但是,如果您的案例确实需要在测试运行后重置状态,那么您应该感到有权使用它。 综上所述,在您的用例中,我不确定您是否需要使用 afterEach()。相反,您可以在测试中将您的用户作为环境变量传递,并检查用户是否被锁定在您的 beforeEach().

describe('some tests', () => {
  beforeEach(() => {
    // The below function should take `Cypress.env('user')` and check if the user is locked
    // If the user is locked, release the lock.
    releaseTheUserLock();
  });

  it('some test', { env: { user: 'foo' } }, () => {
    // some test that uses the user.
    // user can be reference by `Cypress.env('user')`
  })
});
...
// Additionally, I like to make functions that simplify passing in that environment variable --
const user = (user: string) => {
  return { env: { user } };
});
// used in the following way
it('some test', user('foo'), () => {});