十三、模块API——把Cypress当工具库来用

79 阅读3分钟

模块API——把Cypress当工具库来用

前面咱们都是通过cypress opencypress run命令运行测试,但Cypress还有更灵活的用法——作为Node模块调用。这种方式能让你在代码中控制测试的执行逻辑,比如动态挑选测试用例、整合测试报告,甚至和其他工具(如Jenkins、Git)联动。这一章咱们就来解锁这种高级用法。

一、什么是模块API?

简单说,模块API就是允许你在Node.js代码中直接调用Cypress的功能,而不是通过命令行。就像用import fs from 'fs'操作文件一样,你可以用import cypress from 'cypress'来控制测试运行。

核心命令有两个:

  • cypress.run():对应命令行的cypress run,无界面运行测试;
  • cypress.open():对应命令行的cypress open,启动图形界面。

二、基础用法:用代码启动测试

先来看个简单例子,用cypress.run()在Node脚本中运行测试:

1. 安装依赖

首先确保项目里已经安装了Cypress,然后创建一个Node脚本(比如run-tests.js):

// run-tests.js
const cypress = require('cypress')

// 调用cypress.run()启动测试
cypress.run({
  spec: './cypress/integration/login/**/*.js' // 只跑登录相关用例
})
.then((results) => {
  console.log('测试结果:', results)
  // 可以根据结果做后续处理,比如失败时发送邮件
  if (results.totalFailed > 0) {
    console.error(`有${results.totalFailed}个用例失败!`)
  }
})
.catch((err) => {
  console.error('测试启动失败:', err)
})

2. 运行脚本

在命令行执行这个Node脚本:

node run-tests.js

效果和npx cypress run --spec './cypress/integration/login/**/*.js'一样,但你可以在代码中灵活控制参数。

三、高级用法:动态控制测试流程

模块API的真正价值在于“动态控制”,比如根据环境变量挑选用例、整合多份测试报告等。

1. 动态挑选测试用例

假设你想根据命令行参数决定跑哪些用例(比如只跑标注了[smoke]的冒烟测试),可以这样做:

// pick-tests.js
const cypress = require('cypress')
const minimist = require('minimist') // 解析命令行参数的库

// 解析命令行参数(比如 --grep smoke)
const args = minimist(process.argv.slice(2))
const grep = args.grep || '' // 要筛选的关键词

// 定义要运行的用例
const specPattern = grep 
  ? `./cypress/integration/**/*${grep}*.js` // 只跑包含关键词的用例
  : './cypress/integration/**/*.js' // 默认跑所有用例

cypress.run({
  spec: specPattern,
  reporter: 'mochawesome' // 生成HTML报告
})
.then((results) => {
  console.log(`测试完成:成功${results.totalPassed}个,失败${results.totalFailed}个`)
})

运行时传入关键词:

node pick-tests.js --grep smoke # 只跑文件名含smoke的用例

2. 整合多份测试报告

Cypress默认每个测试文件生成一份报告,用模块API可以把它们合并成一份完整报告(需要mochawesome-merge工具):

// merge-reports.js
const cypress = require('cypress')
const { merge } = require('mochawesome-merge') // 合并报告的库
const generator = require('mochawesome-report-generator') // 生成HTML

// 1. 运行测试,生成多份JSON报告
cypress.run({
  reporter: 'mochawesome',
  reporterOptions: {
    overwrite: false, // 不覆盖已有报告
    json: true // 生成JSON格式
  }
})
.then(() => {
  // 2. 合并所有JSON报告
  return merge({
    files: ['./cypress/reports/mochawesome/*.json']
  })
})
.then((mergedReport) => {
  // 3. 生成一份完整的HTML报告
  return generator.create(mergedReport, {
    reportDir: './cypress/reports/merged'
  })
})
.then(() => {
  console.log('报告合并完成!')
})

运行后,在./cypress/reports/merged里就能看到整合后的报告了。

3. 和CI工具联动

在持续集成中,模块API可以帮你实现更复杂的逻辑,比如:

  • 测试失败时自动重试;
  • 根据测试结果决定是否继续部署;
  • 把测试数据推送到数据库。

举个简单例子,测试失败时退出CI流程:

// ci-run.js
const cypress = require('cypress')

cypress.run()
.then((results) => {
  if (results.totalFailed > 0) {
    console.error('测试失败,终止部署!')
    process.exit(1) // 告诉CI工具流程失败
  } else {
    console.log('测试通过,继续部署~')
    process.exit(0)
  }
})

四、cypress.run()的参数详解

cypress.run()支持很多参数,和命令行的cypress run对应,常用的有:

参数作用例子
spec指定要运行的用例文件'./cypress/integration/login.js'
browser指定浏览器'chrome''firefox'
env传递环境变量{ env: 'test', timeout: 10000 }
reporter指定测试报告格式'junit''mochawesome'
record是否上传结果到Dashboardtrue
parallel是否并行运行true(需要配合record

小结

模块API让Cypress从“一个测试工具”变成了“一个可编程的测试库”,尤其适合复杂场景:动态挑选用例、整合报告、和CI/CD工具联动等。掌握这种用法,你能把测试流程深度融入开发链路,实现更灵活的质量保障方案。

下一章咱们进入最后一部分:持续集成实践——如何把Cypress测试嵌入到CI流水线中,实现“代码提交即自动测试”~