You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 22:21:27