使用Cypress自动化需登录用户的问卷表单的测试问题咨询
可重复运行的Cypress问卷E2E测试方案(无删除API时)
方案一:使用专属测试用户池
这是最直接易实现的方案,核心思路是提前准备一批仅用于测试的用户,每次测试选用未被禁用的全新用户,测试完成后调用API禁用该用户,确保下次测试不会重复使用有问卷记录的用户。
操作步骤:
- 提前创建一批测试用户,将用户信息(ID、账号、密码、是否禁用)存在Cypress的
fixture文件中(比如cypress/fixtures/test-users.json) - 测试前从用户池中筛选出未禁用的用户,用该用户登录并执行问卷流程
- 测试完成后,调用禁用用户的API将当前测试用户标记为禁用
- 当用户池耗尽时,批量新增一批测试用户即可
代码示例:
// 测试前置操作:获取可用测试用户并登录 beforeEach(() => { cy.fixture('test-users.json').then(users => { const availableUser = users.find(user => !user.disabled); if (!availableUser) { throw new Error('测试用户池已耗尽,请补充测试用户'); } // 缓存当前测试用户 Cypress.env('currentTestUser', availableUser); // 执行登录流程 cy.login(availableUser.username, availableUser.password); }); }); // 测试后置操作:禁用当前测试用户 afterEach(() => { const currentUser = Cypress.env('currentTestUser'); // 调用禁用用户的API cy.request({ method: 'POST', url: '/api/user/disable', body: { userId: currentUser.id } }); }); // 问卷测试用例 it('完成问卷提交流程', () => { // 选择问卷选项 cy.get('[data-testid="survey-option-1"]').click(); cy.get('[data-testid="survey-option-3"]').click(); // 提交问卷 cy.get('[data-testid="submit-btn"]').click(); // 断言提交成功 cy.get('[data-testid="success-alert"]').should('be.visible'); });
方案二:测试前重置用户问卷状态
如果能获取到数据库操作权限,或者有管理员级别的接口可以重置用户问卷数据,可以在测试开始前直接清空该用户的问卷记录,确保每次测试都是全新的状态。
操作步骤:
- 在Cypress的Node端配置数据库操作的
task(允许测试代码调用Node层的脚本) - 测试前调用该
task,清空当前测试用户的问卷结果 - 执行登录和问卷流程
代码示例:
// cypress.config.js 配置数据库操作task const { defineConfig } = require('cypress'); const mysql = require('mysql2/promise'); module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) { on('task', { async resetUserSurvey(userId) { // 建立数据库连接(根据你的数据库类型调整) const connection = await mysql.createConnection({ host: 'localhost', user: 'test-db-user', password: 'test-db-pass', database: 'test-db' }); // 删除用户的问卷结果 await connection.execute('DELETE FROM survey_results WHERE user_id = ?', [userId]); await connection.end(); return null; } }); }, }, }); // 测试用例中的前置操作 beforeEach(() => { const testUser = { id: 1001, username: 'fixed-test-user', password: 'test-pass' }; // 重置用户问卷数据 cy.task('resetUserSurvey', testUser.id); // 登录 cy.login(testUser.username, testUser.password); });
方案三:利用测试环境快照恢复
如果团队有专门的测试环境,可以通过环境快照的方式,在每次测试前将数据库恢复到初始干净状态,这样所有测试用户的问卷数据都会被清空。
操作步骤:
- 提前创建测试环境的数据库快照(比如MySQL的dump文件、Docker数据卷快照)
- 在测试执行前,通过脚本将数据库恢复到快照状态
- 执行Cypress测试
示例脚本(以Docker环境为例):
# reset-test-env.sh 脚本内容 # 停止并删除数据库容器及数据卷 docker-compose down -v # 启动数据库容器并挂载初始数据卷 docker-compose up -d db # 等待数据库启动完成 sleep 10
然后在package.json中配置测试命令:
"scripts": { "test:e2e": "./reset-test-env.sh && cypress run" }
方案四:兼容已有问卷数据的测试逻辑
如果以上方案都无法实现,可以调整测试逻辑,兼容用户已有问卷数据的情况:
- 如果系统支持修改已提交的问卷,测试流程改为:登录后检查是否已提交问卷,若已提交则进入修改模式,重新选择选项后提交
- 如果系统不允许修改,测试断言只验证「提交操作成功」,不校验是否是首次提交(适合只关注流程可用性的测试场景)
代码示例:
it('完成问卷提交/修改流程', () => { // 登录后检查问卷状态 cy.get('[data-testid="survey-status"]').then($status => { if ($status.text().includes('已提交')) { // 进入修改模式 cy.get('[data-testid="edit-survey-btn"]').click(); } }); // 选择问卷选项 cy.get('[data-testid="survey-option-2"]').click(); // 提交 cy.get('[data-testid="submit-btn"]').click(); // 断言操作成功 cy.get('[data-testid="operation-success"]').should('be.visible'); });
内容的提问来源于stack exchange,提问作者DUDANF
相关产品推荐
相关产品推荐

