如何在GitLab CI流水线中成功运行Flutter集成测试
问题根因
-d chrome模式启动失败卡死:Docker容器默认以root用户运行,Chrome出于安全机制默认禁止root用户在未加--no-sandbox参数的场景下启动,你日志里的Running as root without --no-sandbox is not supported就是明确报错。另外Docker默认/dev/shm分区空间极小,Chrome默认用该分区存储临时运行数据,不加对应参数很容易出现崩溃、无响应问题。-d web-server模式卡死:该模式仅会启动本地web服务托管测试应用,不会自动启动浏览器建立调试连接,需要人工手动打开浏览器访问服务地址才能继续运行,无头CI环境下自然会一直等待连接直到超时。- 原有启动逻辑不可靠:用固定
sleep 10等待chromedriver启动没有做端口就绪校验,很容易出现chromedriver还没完全启动、flutter drive就已经发起连接的时序问题。
可直接落地的修复方案
1. 调整Docker镜像依赖
在Dockerfile最开始的基础工具安装步骤中加入nmap-ncat,用于端口可用性检测,修改后基础工具安装段如下:
# Add basic tools RUN dnf -y install git make gcc gcc-c++ wget unzip zip jq diffutils nmap-ncat \ && dnf clean all
重新构建镜像推到镜像仓库即可。
2. 调整CI配置
替换原有test_ui_integration任务的before_script和script段逻辑,核心是加Chrome启动参数、做chromedriver就绪检测、显式传递浏览器运行参数:
test_ui_integration: needs: - build_deploy_user_service - populate_db tags: - docker stage: test_ui_integration rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" when: always before_script: # 后台启动chromedriver,日志输出到临时文件方便排查 - chromedriver --port=4444 --whitelisted-ips="" > /tmp/chromedriver.log 2>&1 & - export CHROMEDRIVER_PID=$! # 轮询检测4444端口直到就绪,替代固定sleep - while ! nc -z localhost 4444; do sleep 1; done script: - cd $CI_PROJECT_DIR/ui - npm ${NODE_INSTALL_OPTIONS:-i} - npm run build # 配置Chrome环境变量 - export CHROME_EXECUTABLE=/usr/bin/google-chrome # 运行集成测试,显式传入Chrome启动所需参数 - flutter drive \ --driver=integration_test/test_driver/integration_test.dart \ --target=integration_test/integration/app_test.dart \ -d chrome \ --web-run-headless \ --headless \ --web-browser-flag="--no-sandbox" \ --web-browser-flag="--disable-gpu" \ --web-browser-flag="--disable-dev-shm-usage" # 测试结束杀掉chromedriver进程 - kill $CHROMEDRIVER_PID timeout: 40 minutes
如果运行中仍出现异常,可以在flutter drive命令后加一行- cat /tmp/chromedriver.log输出chromedriver运行日志排查问题。
相关疑问解答
flutter run xxx_test.dart和flutter drive的差异:flutter run运行测试时,测试代码和应用代码运行在同一个isolate中,仅适合本地快速调试,不支持外部驱动、模拟用户操作等复杂自动化场景,不属于官方推荐的集成测试标准运行方式。flutter drive是官方标准集成测试入口,会启动两个独立进程:驱动进程负责下发模拟操作指令、校验测试结果,应用进程负责在目标设备上实际运行业务代码,二者通过VM service通信,支持全平台UI自动化,是CI场景的首选方案。
- 是否需要改用移动模拟器执行CI测试:
不需要。Web端集成测试使用无头Chrome运行的资源占用最低、启动速度最快,完全满足Web场景的测试需求。只有当你需要覆盖安卓/iOS端原生功能时,才需要新增对应模拟器/真机的测试任务。
内容的提问来源于stack exchange,提问作者Emile Haas
相关产品推荐
相关产品推荐

