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

Cypress测试运行成功后如何自动删除Mongoose数据库中的测试数据

自动清理Cypress测试生成的Mongoose数据可行方案

以下方案均基于MERN技术栈的常规项目结构实现,无需手动操作即可自动完成测试数据清理:

方案1:使用Cypress Task直连数据库清理(推荐)

该方案在Cypress的Node运行层直接调用项目的Mongoose实例操作数据,无需修改后端业务代码,适用大多数场景。

  • 第一步:在cypress.config.js中注册清理任务,提前准备独立的测试数据库连接串,不要和开发/生产库共用
const { defineConfig } = require('cypress')
const mongoose = require('mongoose')
// 引入你项目中定义的Mongoose模型,比如用户、订单等测试会生成的对应模型
const { User, Order } = require('./backend/models')

async function connectTestDB() {
  // 避免重复连接数据库
  if (mongoose.connection.readyState === 0) {
    await mongoose.connect(process.env.MONGODB_TEST_URI)
  }
}

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      on('task', {
        // 定义清理测试数据的任务
        async clearTestData() {
          await connectTestDB()
          // 建议测试生成数据统一加isTest: true标记,避免误删非测试数据
          await User.deleteMany({ isTest: true })
          await Order.deleteMany({ isTest: true })
          // 如需要全量清空测试库可以用下面的代码,不建议在共用库中使用
          // await mongoose.connection.db.dropDatabase()
          return null
        }
      })
    },
  },
})
  • 第二步:在Cypress全局钩子中调用清理任务,可按需选择清理时机
    在cypress/support/e2e.js中添加以下代码:
// 所有测试用例全部运行完成后执行清理
after(() => {
  cy.task('clearTestData')
})

// 如果需要每个单测用例跑完就清理,替换为afterEach钩子即可
// afterEach(() => {
//   cy.task('clearTestData')
// })

方案2:调用后端封装的测试清理接口

如果项目有严格的数据库访问权限控制,不允许前端测试工具直连数据库,可以仅在测试环境暴露专属清理接口。

  • 后端新增清理路由,仅测试环境加载
// 后端路由文件,仅当运行环境为test时暴露接口
if (process.env.NODE_ENV === 'test') {
  router.post('/api/test/clear-data', async (req, res) => {
    // 增加安全校验,避免测试接口被误调用
    if (req.headers['x-test-secret'] !== process.env.TEST_CLEAR_SECRET) {
      return res.status(403).send('无权访问')
    }
    await User.deleteMany({ isTest: true })
    await Order.deleteMany({ isTest: true })
    res.status(200).send('测试数据清理完成')
  })
}
  • 在Cypress全局钩子中调用该接口
after(() => {
  cy.request({
    method: 'POST',
    url: 'http://你的后端服务地址/api/test/clear-data',
    headers: {
      'x-test-secret': Cypress.env('TEST_CLEAR_SECRET')
    }
  })
})

注意:无论使用哪种方案,都必须使用独立的测试数据库,生成测试数据时建议统一加测试标记,避免出现误删正式数据的问题。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:57:02