Bitbucket Pipeline配置Flutter集成测试及运行失败排查
Bitbucket Pipeline执行Flutter集成测试失败问题
问题描述
本地启动模拟器执行flutter drive --driver=test_driver/integration_test.dart --target=test_driver/run_all_test.dart时,Flutter集成测试可正常运行,但在Bitbucket Pipeline中执行相同命令却报错,尝试添加build apk步骤后问题仍未解决。
相关配置与代码
bitbucket-pipelines.yaml配置
definitions: services: docker: memory: 4096 steps: - step: &generate_code name: 'generate_code' script: - flutter clean - flutter pub get - flutter pub run build_runner build - bash <(curl -s https://raw.githubusercontent.com/objectbox/objectbox-dart/main/install.sh) - flutter test - git clone git@bitbucket.org:connfair/${CI_PROJECT_NAMESPACE}.git .signing - flutter drive \ --driver=test_driver/integration_test.dart \ --target=test_driver/run_all_test.dart artifacts: - lib/**.g.dart - lib/**.i18n.dart
项目文件夹结构

test_driver/integration_test.dart代码
Future<void> main() => integrationDriver();
test_driver/run_all_test.dart代码
void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); initAppWithMockConfig(config: MockConfig1()); loginFailureTest(); loginSuccessTest(); eventSearchTest(); eventStatisticsAuthorizationTest(); ticketScannerAuthorizationTest(); }
示例测试代码
void eventSearchTest() { testWidgets("选择事件搜索代理中的事件后,事件名称会在事件仪表板和应用栏中各显示一次。", (WidgetTester tester) async { await tester.pumpWidget( wrapWithUser(wrapWithProviders(wrapWithApp(MainframeContent()))), ); await tester.pumpAndSettle(); await selectEventFromDashboard(tester, getValidEventId()); expect(find.text(getValidEventName()), findsWidgets); }); }
报错信息

解决方案
核心问题是Bitbucket Pipeline的默认环境没有运行Flutter集成测试所需的Android模拟器或设备,以下是具体修复步骤:
切换到带Flutter和Android环境的镜像
把Pipeline的运行镜像换成预装有Flutter、Android SDK及相关组件的镜像,比如cirrusci/flutter:latest。修改bitbucket-pipelines.yaml的step配置,添加image字段:- step: &generate_code name: 'generate_code' image: cirrusci/flutter:latest script: # 原有脚本内容在Pipeline中启动Android模拟器
在执行flutter drive前添加启动模拟器的脚本步骤:# 安装Android系统镜像 - sdkmanager "system-images;android-33;google_apis;x86_64" # 创建AVD模拟器 - echo "no" | avdmanager create avd -n test_avd -k "system-images;android-33;google_apis;x86_64" # 后台启动模拟器(无音频、无窗口) - emulator -avd test_avd -no-audio -no-window & # 等待模拟器完全启动完成 - adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'指定模拟器执行测试
修改flutter drive命令,指定使用刚启动的模拟器(默认端口为emulator-5554):- flutter drive \ --driver=test_driver/integration_test.dart \ --target=test_driver/run_all_test.dart \ -d emulator-5554调整内存配置
模拟器启动需要足够内存,建议把Docker服务的内存配置调高到8192MB,同时启动模拟器时可指定内存参数:- emulator -avd test_avd -no-audio -no-window -memory 2048 &确保Android组件完整
可在脚本中添加步骤,安装必要的Android组件:- sdkmanager --install "platform-tools" "platforms;android-33" "build-tools;33.0.2"
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

