繁体   English   中英

赛普拉斯 Typescript:如何存储可在每次拆解后使用的变量?

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

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

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

我曾尝试在 class 中使用 static 变量,但这似乎不起作用。

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

class myUser {
  static user;

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

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

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

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

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

请阅读使用 after 或 afterEach 钩子

反模式:使用 after 或 afterEach 钩子来清理 state。

如果测试用例在完成之前失败,则同样适用于 state 的任何使用

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


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

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

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

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 引用的文章直接来自赛普拉斯,并且确实提出了一些引人注目的观点,但我仍然相信有计划使用afterafterEach的地方。 尽可能使用beforebeforeEach更好? 绝对地。 但是,如果您的案例确实需要在测试运行后重置 state,那么您应该感到有权使用它。 尽管如此,在您的用例中,我不确定您是否需要使用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'), () => {});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM