You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Cypress自动化需登录用户的问卷表单的测试问题咨询

可重复运行的Cypress问卷E2E测试方案(无删除API时)

方案一:使用专属测试用户池

这是最直接易实现的方案,核心思路是提前准备一批仅用于测试的用户,每次测试选用未被禁用的全新用户,测试完成后调用API禁用该用户,确保下次测试不会重复使用有问卷记录的用户。

操作步骤:

  1. 提前创建一批测试用户,将用户信息(ID、账号、密码、是否禁用)存在Cypress的fixture文件中(比如cypress/fixtures/test-users.json)
  2. 测试前从用户池中筛选出未禁用的用户,用该用户登录并执行问卷流程
  3. 测试完成后,调用禁用用户的API将当前测试用户标记为禁用
  4. 当用户池耗尽时,批量新增一批测试用户即可

代码示例:

// 测试前置操作:获取可用测试用户并登录
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');
});

方案二:测试前重置用户问卷状态

如果能获取到数据库操作权限,或者有管理员级别的接口可以重置用户问卷数据,可以在测试开始前直接清空该用户的问卷记录,确保每次测试都是全新的状态。

操作步骤:

  1. 在Cypress的Node端配置数据库操作的task(允许测试代码调用Node层的脚本)
  2. 测试前调用该task,清空当前测试用户的问卷结果
  3. 执行登录和问卷流程

代码示例:

// 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);
});

方案三:利用测试环境快照恢复

如果团队有专门的测试环境,可以通过环境快照的方式,在每次测试前将数据库恢复到初始干净状态,这样所有测试用户的问卷数据都会被清空。

操作步骤:

  1. 提前创建测试环境的数据库快照(比如MySQL的dump文件、Docker数据卷快照)
  2. 在测试执行前,通过脚本将数据库恢复到快照状态
  3. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:47:48