赛普拉斯测试之间通过状态的最佳实践是什么

Jak*_* He 11 cypress

我想在每次测试之间传递/共享数据。在 Cypress 中实现它的最佳方法是什么?

例如:

 it('test 1'), () => {
   cy.wrap('one').as('a')
   const state1 = 'stat1'
 })

 it('test 2'), () => {
   cy.wrap('two').as('b')
 })

 it('test 2'), () => {
   //I want to access this.a and this.b

   //Also I want to access state1

 })
Run Code Online (Sandbox Code Playgroud)

Emz*_*zaw 12

我可以看到答案对作者有用,但如果有人需要在不同的测试文件之间共享数据,解决方案是使用cy 任务方法并将数据存储在 Node 环境中,例如在我的情况下,我需要存储用户数据:

// cypress/plugins/index.ts
export default (on, config) => {
  on('task', {
    setUserData: (userData: UserDataType) => {
      global.userData = userData;
      return null;
    },
    getUserData: () => {
      return global.userData;
    },
  });
};
Run Code Online (Sandbox Code Playgroud)

那么在测试用例中我们可以这样做:

// cypress/integration/login.spec.ts
describe('Login', () => {
  it('should work', () => {
    cy.visit('/login-page');
    cy.intercept('api/login-endpoint').as('postLogin');
    // login interactions
    cy.wait('@postLogin').then((interception) => {
      // intercept user data and store it in global variable
      cy.task('setUserData', JSON.parse(interception.response.body));
    });
    // ... further assertions
  });
});
Run Code Online (Sandbox Code Playgroud)

稍后我们可以轻松检索这些数据:

// cypress/integration/otherTest.spec.ts
describe('Other test', () => {
  it('uses user data', () => {
    cy.task('getUserData').then((userData: UserDataType) => {
      console.log(userData);
      // voila! Stored data between two .spec files
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

您还需要为此扩展 Node TS 类型,但这个答案已经足够长了。

是的,我知道这根本不是编写测试的好方法,因为它使它们相互依赖,但有时应用程序中的长交互流程使得有必要这样做。


and*_*ras 10

正如abbr评论中所指出的,如果测试从不同的 url 开始,则使用全局变量共享值将不起作用。

所以这些不起作用:

  • 全局变量赋值和读取(无论是否在describe/context块之外)
  • 依赖Mocha this.state(测试后会清除)
  • 使用Cypress as

剩下的当然是文件。读和写。​


describe("Test", () => {

  it("Can access 3000", function () {
    cy.visit("http://localhost:3000");

    cy.writeFile("shared.json", {count: 2})
  });


  it("Can access 8000", function () {
    cy.visit("http://localhost:8000");

    cy.readFile("shared.json").then(cy.log)
  });

});

Run Code Online (Sandbox Code Playgroud)


Jos*_*ica 7

对于 Javascript 变量,您可以执行以下操作:

let state;

describe('test 1', () => {
    it('changes state', () => {
        state = "hi";
     });
});

describe('test 2', () => {
    it('reports state', () => {
        cy.log(state); // logs "hi" to the Cypress log panel
     });
});
Run Code Online (Sandbox Code Playgroud)

.as()似乎无法在describe块之间传递状态。

  • 如果 *it* 测试导航到不同的域,则此方法不起作用。 (5认同)
  • 更好的方法是使用当前套件上下文:设置 `this.state` 并且您可以跳过在全局范围内“让”(声明)变量的过程。请注意,您必须使用“function(){}”代替“()=>{}”,以便“this”被分配。 (2认同)