问题描述
在GitLab持续集成中遇到了问题。他正在努力让端到端测试在GitLab的流水线中正常运行。尽管在本地运行所有测试都没有问题,但在使用GitLab的持续集成功能时遇到了一些问题。
在本地运行测试时,Puppeteer会使用无头版本的Chrome进行端到端测试,但是ReactJS的Create React App(CRA)服务器必须在运行时才能正常工作。为了在本地运行CRA服务器,用户会在一个终端中运行npm start
,一旦它完全运行,就会在另一个终端中运行npm test
。在测试期间,Puppeteer使用无头Chromium运行端到端测试。
问题在于,npm start
会启动CRA服务器,但是这个进程不会停止,用户不知道如何在不手动退出的情况下停止它。这会导致Docker挂起,并阻止他启动测试。
解决方案
最佳解决方案:使用jest-puppeteer库启动本地Web服务器
用户可以通过使用jest-puppeteer
库来解决这个问题,该库允许您在测试期间启动一个本地Web服务器。
步骤
- 首先,安装
jest-puppeteer
库:
npm install --save-dev jest-puppeteer puppeteer
- 创建一个名为
jest-puppeteer.config.js
的配置文件,并配置launch
和server
部分。以下是一个示例配置:
javascript
module.exports = {
launch: {
headless: true,
},
server: {
command: 'npm start', // 运行CRA服务器的命令
},
};
- 在
.gitlab-ci.yml
中更新测试阶段的脚本:
“`yaml
stages:
– test
test:
stage: test
script:
– npm run test:ci-deps
– npm run test:e2e # 运行Jest + Puppeteer测试
“`
通过使用jest-puppeteer
库,您可以在测试期间启动本地Web服务器,并确保在测试完成后关闭它。
其他解决方案:手动编写启动脚本
如果您希望采取其他方法,您可以手动编写脚本来控制应用程序的启动和关闭顺序。
步骤
- 编写一个启动脚本,例如
start-and-test.sh
:
bash
#!/bin/bash
npm start & # 在后台启动CRA服务器
CRA_PID=$! # 获取CRA服务器进程ID
sleep 10 # 等待足够的时间,确保CRA服务器完全启动
npm run test:e2e # 运行端到端测试
kill $CRA_PID # 关闭CRA服务器
- 更新
.gitlab-ci.yml
中的测试阶段的脚本:
“`yaml
stages:
– test
test:
stage: test
script:
– chmod +x start-and-test.sh # 赋予脚本执行权限
– ./start-and-test.sh # 运行启动脚本
“`
使用这种方法,您可以手动控制应用程序的启动和关闭顺序,并在测试完成后关闭CRA服务器。
请注意,两种方法都可以解决问题,您可以根据您的偏好和需求选择其中一种方法。
请注意以上操作可能涉及版本差异或涉及操作风险,具体操作前请做好备份并在非生产环境中进行测试。
这些解决方案将帮助您在GitLab持续集成中运行ReactJS应用程序并使用Jest + Puppeteer进行端到端测试。通过选择其中一种方法,您将能够在测试完成后成功关闭CRA服务器,并在持续集成流水线中顺利运行测试。