如何在Cypress JS测试中合并多MySQL查询数据并按日期排序
搞定Cypress测试中UI表格数据的分组与排序验证问题
我的UI里有个HTML表格,内容如下:
| COMPANY | MEETING DATE | MEETING TYPE | |---------|--------------|--------------| | ABC Ltd. | 15-Jul-2011 | Annual | | XYZ Inc. | 24-Oct-2008 | Annual |
我正在写Cypress测试验证这个表格的数据,但涉及的MySQL查询要关联多张表,有点麻烦:
- 第一个查询要拿每个
company.name,用来核对UI表格第一列; - 第二个查询得用第一个查询的
company.companyId,取对应的最新meetingdate和meetingtype,核对第二、三列; - 而且UI表格是按会议日期降序排列的。
现在我能分别拿到公司名称和会议详情,但不知道怎么把它们对应起来,再按日期排序。下面是我目前的代码:
// 查询当前登录用户关联的公司 cy.task('queryDb', `SELECT c.name, c.companyId FROM gap.companies c JOIN gap.user_companies guc ON c.companyId = guc.companyId JOIN gap.users users ON guc.userId = users.userId WHERE users.username = '${Cypress.env('username')}';`).then(companies => { companies.forEach(company => { cy.log('公司名称: ' + company.name) cy.log('公司ID: ' + company.companyId) // 查询每个公司的最新会议详情 cy.task('queryDb', `SELECT r.meetingdate, r.meetingtype FROM gap.reports r WHERE r.reportId IN ( SELECT report_comps.reportId FROM gap.report_companies report_comps WHERE report_comps.companyId = '${company.companyId}' ) ORDER BY creationdate DESC LIMIT 1;`).then(meeting=> { if (meeting[0]?.meetingdate && meeting[0]?.meetingtype) { cy.log(meeting[0].meetingdate) cy.log(meeting[0].meetingtype) } else { cy.log('会议详情: 空') } }) }) });
解决办法
1. 合并SQL查询,一次性拿到所有需要的数据
把两个查询合并成一个关联查询,直接获取每个公司对应的最新会议信息,还能直接按会议日期降序排序,和UI表格顺序一致,不用在Cypress里循环查数据库,效率更高。示例SQL:
SELECT c.name AS company_name, DATE_FORMAT(r.meetingdate, '%d-%b-%Y') AS meeting_date, -- 直接转成UI显示的格式 r.meetingtype FROM gap.companies c JOIN gap.user_companies guc ON c.companyId = guc.companyId JOIN gap.users users ON guc.userId = users.userId LEFT JOIN ( -- 子查询获取每个公司的最新会议记录 SELECT rc.companyId, r.meetingdate, r.meetingtype FROM gap.report_companies rc JOIN gap.reports r ON rc.reportId = r.reportId ORDER BY r.creationdate DESC ) r ON c.companyId = r.companyId WHERE users.username = '${Cypress.env('username')}' GROUP BY c.companyId, c.name ORDER BY r.meetingdate DESC;
这里用LEFT JOIN保证没有会议的公司也能被查到,对应UI里的空白行;DATE_FORMAT直接把数据库日期转成UI显示的DD-Mon-YYYY格式,后续不用再处理。
2. 调整Cypress代码,直接对比数据和UI
拿到合并后的数据集后,直接遍历UI表格的每一行做断言:
cy.task('queryDb', ` SELECT c.name AS company_name, DATE_FORMAT(r.meetingdate, '%d-%b-%Y') AS meeting_date, r.meetingtype FROM gap.companies c JOIN gap.user_companies guc ON c.companyId = guc.companyId JOIN gap.users users ON guc.userId = users.userId LEFT JOIN ( SELECT rc.companyId, r.meetingdate, r.meetingtype FROM gap.report_companies rc JOIN gap.reports r ON rc.reportId = r.reportId ORDER BY r.creationdate DESC ) r ON c.companyId = r.companyId WHERE users.username = '${Cypress.env('username')}' GROUP BY c.companyId, c.name ORDER BY r.meetingdate DESC; `).then(expectedData => { // 遍历UI表格的每一行,和预期数据逐一对比 cy.get('table tbody tr').each(($row, index) => { const expectedRow = expectedData[index]; // 验证公司名称列 cy.wrap($row).find('td').eq(0).should('have.text', expectedRow.company_name); // 验证会议日期列 if (expectedRow.meeting_date) { cy.wrap($row).find('td').eq(1).should('have.text', expectedRow.meeting_date); } else { cy.wrap($row).find('td').eq(1).should('be.empty'); } // 验证会议类型列 if (expectedRow.meetingtype) { cy.wrap($row).find('td').eq(2).should('have.text', expectedRow.meetingtype); } else { cy.wrap($row).find('td').eq(2).should('be.empty'); } }); });
3. 注意点
- 如果数据库里的日期格式和UI显示的不一致,一定要在SQL里用
DATE_FORMAT转好,或者在Cypress里用日期库(比如dayjs)处理; - 确保SQL查询的排序逻辑和UI完全一致,这里是按
meetingdate降序,要和UI的排序规则对应; - 用
LEFT JOIN而不是INNER JOIN,避免漏掉没有会议记录的公司。
内容的提问来源于stack exchange,提问作者user9847788
相关产品推荐
相关产品推荐

