GitHub Actions搭配Firebase模拟器运行iOS CI测试 本地通过CI失败排查
问题解决方案
1. 修复Shell变量未解析问题
你当前unit_test任务中,firebase执行命令用单引号包裹了xcodebuild逻辑,单引号会阻止Shell变量解析,你定义的$XC_TEST_RUN、$DEVICE等环境变量全部不会生效,导致xcodebuild拿到的参数错误,直接执行失败。
把单引号替换为双引号即可,修改后的命令参考:
- name: Run unit/integration tests (Execute w/ Firebase emulators) run: firebase emulators:exec --only firestore "xcodebuild test-without-building -xctestrun \$(find . -type f -name $XC_TEST_RUN) -destination \"platform=iOS Simulator,name=$DEVICE\" -derivedDataPath $DERIVED_DATA_PATH -enableCodeCoverage YES -only-testing:$UNIT_TEST_TARGET"
2. 测试代码显式指定Firebase模拟器地址
本地运行时你可能已经默认配置了Firestore指向本地模拟器,但CI环境的测试包不会自动识别模拟器地址,需要在所有Firestore操作执行前显式配置连接地址,建议把这段代码放在测试类的setUp方法中:
let settings = Firestore.firestore().settings settings.host = "localhost:8080" settings.isSSLEnabled = false Firestore.firestore().settings = settings
3. 适配CI环境性能差异
CI机器性能普遍低于本地开发设备,Firebase模拟器启动后需要几秒初始化时间才能处理请求,你可以做两个调整:
- 给测试用例的超时时间从4秒延长到10秒以上
- 给firebase命令添加
--project demo-test参数,使用demo开头的虚拟项目ID,避免误连线上真实项目,同时加快模拟器启动速度
4. 检查firebase配置文件存在性
保证项目根目录下存在firebase.json文件,且指定了Firestore模拟器的固定端口,示例配置如下:
{ "emulators": { "firestore": { "port": 8080 } } }
如果没有这个文件,CI环境的Firebase模拟器会使用随机端口,测试代码无法找到正确的连接地址。
内容的提问来源于stack exchange,提问作者Joseph Francis
相关产品推荐
相关产品推荐

