Cypress中如何基于前置测试生成的订单数组动态生成并执行验证测试用例
Cypress中如何基于前置测试生成的订单数组动态生成并执行验证测试用例
我明白你的问题了——你想先批量创建订单(每个订单对应一个it块),然后再针对每个生成的订单单独跑验证用例,但现在验证用例根本没执行,因为Cypress的测试用例注册逻辑和你想的不一样。
问题根源
Cypress的it测试块是在测试文件解析阶段就被全部注册的,而不是在测试执行阶段。你的代码里,第二个PO_Array.forEach循环是在describe解析时就跑了,这时候第一个循环里的创建订单it块还没执行,PO_Array还是空数组,自然不会生成任何验证用例。
解决方案:拆分测试文件(最可靠)
把创建订单和验证订单拆成两个独立的测试文件,利用Cypress按文件顺序执行的特性,确保验证用例生成时,订单数据已经被写入文件了。
1. 创建订单的测试文件(cypress/e2e/create-orders.cy.js)
import DuplicateExistingNewOrderStyle from "../fixtures/DuplicateExistingNewOrderStyle.json"; const path = require('path'); describe("Create Orders", () => { let PO_Array = []; DuplicateExistingNewOrderStyle.forEach((DuplicateStyleData, index) => { it(`Create ${DuplicateStyleData.brand} order for dup ExistingStyle`, () => { const orderData = { brand: DuplicateStyleData.brand, purchaseOrder: Date.now() }; PO_Array.push(orderData); // 实时写入文件,避免数据丢失 cy.writeFile(path.resolve(__dirname, '../POcsv/dataform1.json'), PO_Array); }); }); // 最后统一写入一次,确保所有订单数据都被保存 after(() => { cy.writeFile(path.resolve(__dirname, '../POcsv/dataform1.json'), PO_Array); }); });
2. 验证订单的测试文件(cypress/e2e/validate-orders.cy.js)
const fs = require('fs'); const path = require('path'); describe("Validate Orders", () => { // 同步读取文件——此时第一个测试文件已经执行完毕,文件里已有订单数据 const PO_Array = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../POcsv/dataform1.json'), 'utf8')); PO_Array.forEach(orderData => { it(`${orderData.brand} Validate order test`, () => { cy.log(`Validating ${orderData.brand} order with PO: ${orderData.purchaseOrder}`); // 在这里编写你的验证逻辑,比如: // cy.visit(`/orders/${orderData.purchaseOrder}`); // cy.get('.brand-label').should('have.text', orderData.brand); }); }); });
为什么这个方法有效
- Cypress会按文件顺序执行测试,先跑
create-orders.cy.js,把所有订单数据写入文件。 - 然后跑
validate-orders.cy.js,此时文件已经有数据了,同步读取后就能动态生成对应数量的验证用例,完全符合你的需求(Nike和Adidas各跑一次验证)。
你之前尝试的方法为什么没生效
你之前在同一个describe里用读写文件的方式,本质上还是没避开Cypress的测试用例注册时机问题——验证用例的forEach循环在解析阶段就执行了,这时候文件还没被写入数据,自然读不到内容,也就生成不了用例。
备注:内容来源于stack exchange,提问作者Muneeb
相关产品推荐
相关产品推荐

