我如何在cypress中存储api get(脚本类型)的请求,而不必等待套件中的每个测试在该请求后加载其数据?我有时会浪费20秒的等待时间。有存储选项吗?
首先,我试图忽略那些api的长加载时间,与cy.intercept('api.link',{}).as('link')
,或类似的方法,但我意识到这不是一个解决方案。我也不认为cy.session()
是一个选择。
我希望我已经提供了所有的细节,谢谢你
如果您的测试在相同的规范文件中,您可以通过Cypress.env()
将值存储在Cypress环境变量中,或者如果它们在相同的描述块中,您可以简单地在before
块中执行请求。
// foo.spec.ts
describe('test', () => {
let response;
before(() => {
cy.request('foo', (req) => {
req.continue((res) => {
// if using Cypress.env()
Cypress.env('response', res);
// if using a scoped variable
response = res;
});
});
});
it('tests', () => {
// something that uses either `Cypress.env('response')` or `response`.
});
})
如果您需要在整个套件之前只运行一次,您可以在plugins/index
文件中包含该调用,并使用before:run
API
// plugins/index.js
...
const axios = require('axios').default // using axios to query endpoint
...
on('before:run', async () => {
await axios.get('foo').then((response) => {
config.env.CYPRESS_MY_VAR = response
})
});
...
// some.spec.ts
describe('test', () => {
it('test', () => {
cy.log(Cypress.env('MY_VAR');
});
});
那么,上面发生了什么?
- 我们使用
axios
来获取数据。您可以使用任何库或方法查询端点,Axios只是我的首选。 - 在
.then()
回调中,我们将响应并将其分配给Cypress变量。因为Cypress.
和cy.
命令在plugins/index
文件中不可用,所以我们使用config.env.
来设置环境变量。任何以CYPRESS_
为前缀的变量都被解释为自定义环境变量。在本例中,CYPRESS_MY_VAR
- 在测试中,我们记录
Cypress.env('MY_VAR')
的值。注意这个键是MY_VAR
而不是CYPRESS_MY_VAR
。
您可以添加一个简单的缓存并将其封装在自定义命令
柏树/支持/index.js
let cachedResult = null;
Cypress.Commands.add('readAndCacheApi', async (url) => {
if (!cachedResult) {
console.log('fetching')
const result = await fetch(url)
cachedResult = result
return cachedResult
} else {
console.log('using cache')
return cachedResult
}
})
规范1
it('test1', () => {
cy.readAndCacheApi('https://jsonplaceholder.typicode.com/todos/1') // logs "fetching"
.then(data => {
})
cy.readAndCacheApi('https://jsonplaceholder.typicode.com/todos/1') // logs "using cache"
.then(data => {
})
})
it('test2', () => {
cy.readAndCacheApi('https://jsonplaceholder.typicode.com/todos/1') // logs "using cache"
.then(data => {
})
})
Spec 2,运行Spec 1
it('test3', () => {
cy.readAndCacheApi('https://jsonplaceholder.typicode.com/todos/1') // logs "using cache"
.then(data => {
})
})
Spec 2,独立运行
it('test3', () => {
cy.readAndCacheApi('https://jsonplaceholder.typicode.com/todos/1') // logs "fetching"
.then(data => {
})
})