我想在每次测试之间传递/共享数据。在 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)
对于 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块之间传递状态。
| 归档时间: |
|
| 查看次数: |
7357 次 |
| 最近记录: |