自动化测试的核心宗旨就是尽可能减少人工参与的情况下保证系统的稳定运行。当完成核心业务的自动化用例后,我们可以通过定时运行或者有新代码提交等等需要验证核心业务是否正常,并且通过邮件或者其他的手段通知研发同学自动化用例运行结果。
本文详细记录Cypress自动化用例如何在centos服务器中定时运行,并且通过邮件通知自动化测试用例的运行结果。
为了配合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
的文件,简单编辑邮件发送脚本。
jsxconst 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
为了让我们能够获取更多的自动化用例执行结果,比如代码覆盖率等信息,我们需要额外添加一些依赖
bashnpm install @cypress/code-coverage nyc istanbul-lib-coverage --save-dev
cypress/plugins/index.js
中注册插件 bashconst codeCoverageTask = require('@cypress/code-coverage/task'); module.exports = (on, config) => { codeCoverageTask(on, config); return config; };
cypress/support/index.js
中导入相应的覆盖率命令 bashimport '@cypress/code-coverage/support';
cypress.json
中启用代码覆盖率插件 bash{ "pluginsFile": "cypress/plugins/index.js", "supportFile": "cypress/support/index.js" }
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
以获取代码覆盖率。脚本最后都将成功案例数量和代码覆盖率包含在邮件通知中。
bashYour system is missing the dependency: Xvfb Install Xvfb and run Cypress again.
当您在 Linux 系统(如 CentOS)上遇到此错误时,是因为您的系统缺少运行 Cypress 所需的库。
解决方案
CentOS 依赖安装
bashsudo yum install -y xorg-x11-server-Xvfb at-spi2-atk gtk3 libXScrnSaver libxslt