CentOS定时运行Cypress自动化测试用例并通过邮件通知结果

前言

自动化测试的核心宗旨就是尽可能减少人工参与的情况下保证系统的稳定运行。当完成核心业务的自动化用例后,我们可以通过定时运行或者有新代码提交等等需要验证核心业务是否正常,并且通过邮件或者其他的手段通知研发同学自动化用例运行结果。

本文详细记录Cypress自动化用例如何在centos服务器中定时运行,并且通过邮件通知自动化测试用例的运行结果。

编写运行shell脚本

为了配合centos的定时器功能,我们需要编写shell脚本来确定运行过程中的步骤。

如下脚本的功能是cypress后台执行全部自动化测试用例,并在控制台中打印出「整体用例是否全部运行成功」

bash
#!/bin/bash set -e npx cypress run --headless STATUS=$? if [ $STATUS -eq 0 ] then echo -e "您的测试用例已通过" else echo -e "您的测试用例未通过" fi

自动化用例脚本运行详情

bash
./cypress_run.sh DevTools listening on ws://127.0.0.1:49766/devtools/browser/1f0e8c20-a138-419b-b8d8-7d42163b5a7e ==================================================================================================== (Run Starting) ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Cypress: 12.15.0 │ │ Browser: Electron 106 (headless) │ Node Version: v14.20.0 (/Users/.nvm/versions/node/v14.20.0/bin/node) │ Specs: 1 found (index.cy.ts) │ Searched: cypress/e2e/**/*.cy.{js,jsx,ts,tsx} └────────────────────────────────────────────────────────────────────────────────────────────────┘ ──────────────────────────────────────────────────────────────────────────────────────────────────── Running: index.cy.ts (1 of 1) Tag页面用例 ✓ 访问Tag页面,查看功能是否正常 (7695ms) 1 passing (9s) (Results) ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Tests: 1 │ Passing: 1 │ Failing: 0 │ Pending: 0 │ Skipped: 0 │ Screenshots: 0 │ Video: true │ Duration: 9 seconds │ │ Spec Ran: index.cy.ts │ └────────────────────────────────────────────────────────────────────────────────────────────────┘ (Video) - Started compressing: Compressing to 32 CRF - Finished compressing: 3 seconds - Video output: /Users/Desktop/apps/web/cypress/videos/index.cy.ts.mp4 ==================================================================================================== (Run Finished) Spec Tests Passing Failing Pending Skipped ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ │ ✔ index.cy.ts 00:09 1 1 - - - │ └────────────────────────────────────────────────────────────────────────────────────────────────┘ ✔ All specs passed! 00:09 1 1 - - - **您的测试用例已通过**

定时执行用例并邮件通知运行结果

设置定时任务

Centos或者MacOS系统自带的 crontab 工具设置定时执行自动化测试用例脚本,比如我设置1分钟执行一次测试用例脚本。

bash
* * * * * /apps/web/cypress_run.sh > /var/log/cypress.log 2>&1

执行结果

邮件发送自动化用例结果

发送邮件需要依赖 node 的 nodemailer 来实现邮件能力。

在您的项目根目录下,创建一个名为 sendNotification.js 的文件,简单编辑邮件发送脚本。

jsx
const nodemailer = require('nodemailer'); async function sendEmail(subject, body) { let transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: 'your_email@gmail.com', pass: 'your_email_password', }, }); let mailOptions = { from: 'your_email@gmail.com', to: 'recipient_email@example.com', subject: subject, text: body, }; try { await transporter.sendMail(mailOptions); console.log('邮件已发送'); } catch (error) { console.error('邮件发送失败', error); } } module.exports = { sendEmail };

注意:请使用您自己的 Gmail 凭据替换 'your_email@gmail.com''your_email_password'

在cypress的shell脚本中加上邮件通知功能

bash
#!/bin/bash set -e cd your_project_name npx cypress run --headless STATUS=$? if [ $STATUS -eq 0 ] then node -e "require('./sendNotification.js').sendEmail('Cypress 用例通过', '您的测试用例已通过。')" else node -e "require('./sendNotification.js').sendEmail('Cypress 用例失败', '您的测试用例未通过。')" fi

计算自动化用例代码覆盖率

为了让我们能够获取更多的自动化用例执行结果,比如代码覆盖率等信息,我们需要额外添加一些依赖

bash
npm install @cypress/code-coverage nyc istanbul-lib-coverage --save-dev
  1. cypress/plugins/index.js 中注册插件
bash
const codeCoverageTask = require('@cypress/code-coverage/task'); module.exports = (on, config) => { codeCoverageTask(on, config); return config; };
  1. cypress/support/index.js 中导入相应的覆盖率命令
bash
import '@cypress/code-coverage/support';
  1. 在根路径的 cypress.json 中启用代码覆盖率插件
bash
{ "pluginsFile": "cypress/plugins/index.js", "supportFile": "cypress/support/index.js" }
  1. 更新自动化测试用例脚本
bash
#!/bin/bash set -e OUTPUT="$(npx cypress run --headless)" echo "$OUTPUT" STATUS=$? PASSED=$(echo "$OUTPUT" | grep -oP '(?<=Passed: )\\d+') COVERAGE="$(npx nyc report --reporter=text-summary)" echo "$COVERAGE" if [ $STATUS -eq 0 ] then node -e "require('./sendNotification.js').sendEmail('Cypress 用例通过', '成功案例数量:$PASSED\\n\\n代码覆盖率:\\n$COVERAGE')" else node -e "require('./sendNotification.js').sendEmail('Cypress 用例失败', '成功案例数量:$PASSED\\n\\n代码覆盖率:\\n$COVERAGE')" fi

其中特殊命令 npx nyc report --reporter=text-summary 以获取代码覆盖率。脚本最后都将成功案例数量和代码覆盖率包含在邮件通知中。

意外情况处理

  1. CentOS 系统缺少依赖
bash
Your system is missing the dependency: Xvfb Install Xvfb and run Cypress again.

当您在 Linux 系统(如 CentOS)上遇到此错误时,是因为您的系统缺少运行 Cypress 所需的库。

解决方案

CentOS 依赖安装

bash
sudo yum install -y xorg-x11-server-Xvfb at-spi2-atk gtk3 libXScrnSaver libxslt