testing - 使用 Travis CI 进行 Flutter 集成测试
问题描述
一、问题总结
我想要一个 Travis CI 设置,它可以让我flutter driver
在 Android 和 iOS 环境中运行测试。为此,我希望我必须在不同的环境中安装 Flutter、Android 和 iOS。
2. 到目前为止我所拥有的
我能找到的关于这个主题的大多数帖子都非常过时,或者具有非常复杂的设置。在我的搜索中不断出现的一些是:
在 Travis 上测试 Flutter 应用程序,作者 Yegor Jbanov。这一个涵盖单元和小部件测试(
flutter test
),但不包括集成测试。它是从 2017 年初开始的,Travis CI 可能已经简化了它的 API,因为我已经设法让它只使用这个:
language: dart dart: - stable dart_task: - dartfmt install: - git clone https://github.com/flutter/flutter.git -b stable script: - ./flutter/bin/flutter doctor - ./flutter/bin/flutter test
- 我发现一个非常有用的资源是
.travis.yml
Flutter samples repo 中的资源。不过,那里的设置对我来说似乎很复杂。 - 我能得到的最接近我想要的结果类似于 Maurice McCabe 的Flutter 单元、小部件以及在 Travis-CI 上使用 IOS 和 Android 模拟器进行的集成测试。
- 同样,这似乎过于复杂和过时。
3. 我心中所想的草图
我之前提到的示例中的script
andinstall
步骤可以替换为jobs
with stage
s。这样,每个阶段将代表一种步骤。Unit 和 Widget 一个阶段进行,Android 和 iOS 上的集成测试在另外两个阶段进行,这与 Maurice McCabe 和 Flutter 示例显示的类似。例如:
jobs:
include:
- stage: Flutter Test
language: dart
os: linux
install: git clone $FLUTTER_GITHUB -b stable
before_script:
- ./flutter/bin/flutter doctor
script:
- ./flutter/bin/flutter test
- stage: Integration Test on Android
os: linux
dist: trusty
language: android
android: # the things here are what probably needs to be fixed
components:
- build-tools-28.0.3
- android-28
install: git clone $FLUTTER_GITHUB -b stable
before_script:
- ./flutter/bin/flutter doctor
script:
- ./flutter/bin/flutter drive --target=test_driver/app.dart
stage
如果我可以为任务创建一个dartfmt
在组织方面也很好的任务。
解决方案
一、概述
感谢@MirceaMatei 和 Maurice McCabe 在这方面提供的帮助。
- 我还不能让 Android 集成测试工作(
stage
下面的最后一个代码),但至少 iOS 工作正常。- 由于不同的版本和许可证,Android 更难做对,而苹果在这方面做得更好。
- 您将在下面找到的代码是我正在处理的自定义单声道回购设置的一部分。
- 文件夹结构由一个文件夹
app
和一个packages
文件夹组成。
- 文件夹结构由一个文件夹
- 我还没有按这两个文件夹对代码覆盖率进行分段,因此此设置当前正在将代码覆盖率从一个文件夹覆盖到另一个文件夹。
- 使用顶级
install
部分使 Travis 为每个阶段重复该设置,从而避免在每个阶段重复执行此操作。
我将在下面分享我当前的(尽管不完整)设置,但通过这个 Github Gist将持续改进,这是一种与社区交互以改进代码的比 StackOverflow 更好的方式——这不是它的目的。
总而言之,我认为 Travis CI 在谈到 Flutter 时真的丢球了——也许是整个 Android。我最近接触的许多从业者大肆宣传的一个更简单的替代方案是Codemagic,它还提供代码签名和对 iOS 和 Android 应用程序商店的自动部署。
2. 有用的资源
我不太喜欢集成测试的 Travis 文档。创建纯 Android 应用程序的人提出了类似的问题。
无论如何,这里有一些我在搜索过程中发现的有用资源:
- 关于“错误:目标 ID 无效。使用‘android list targets’获取目标 ID”的问题评论。
- 带有 Google API 的“所选目标的 --abi armeabi-v7a 无效”
- 有没有办法在 Travis CI 构建中启动 android 模拟器?
- Travis-CI
Android 28 licenses have not been accepted
- Flutter 示例 Travis 设置
- @MirceaMatei 的 Travis 设置建议
- Travis 构建 Android 项目文档
- Maurice McCabe 与 Travis 的单元和集成测试 文章 on Medium
3. 守则
请不要在此处发布代码改进建议,而是在Github Gist中发布。yaml
每次有用的迭代到来时,我都会更新自己下面的代码。
language: dart
env:
global:
- DARTSDK=./flutter/bin/cache/dart-sdk/bin
- DARTFMT=$DARTSDK/dartfmt
- FLUTTER=./flutter/bin/flutter
- FLUTTER_UP=../flutter/bin/flutter
- FLUTTER_GITHUB=https://github.com/flutter/flutter.git
- CODECOV=https://codecov.io/bash
- PACKAGES=packages
- APP=app
- ANDROID_API=28
install:
- git clone $FLUTTER_GITHUB -b stable --depth 1
- $FLUTTER doctor
- $FLUTTER pub get
jobs:
include:
- stage: Formatting
script:
- $DARTFMT -n $PACKAGES --set-exit-if-changed
- stage: Packages Flutter Test
script:
- $FLUTTER test --coverage $PACKAGES
after_success:
- bash <(curl -s $CODECOV)
- stage: App Flutter Test
script:
- cd $APP
- $FLUTTER_UP test --coverage
after_success:
- bash <(curl -s $CODECOV)
- stage: iOS Integration Tests
os: osx
osx_image: xcode11
before_script:
- open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app
- export HOMEBREW_NO_AUTO_UPDATE=1
- brew install libimobiledevice
- brew install ideviceinstaller
- brew install ios-deploy
- brew install cocoapods || echo 'ignore exit(1)'
- brew link --overwrite cocoapods
script:
- cd $APP
- $FLUTTER_UP driver --target=test_driver/app.dart77
- stage: Android Integration Tests
language: android
dist: trusty
android:
components:
- tools
- platform-tools
- build-tools-25.0.3
- android-24
- android-22
- extra-google-google_play_services
- extra-google-m2repository
- extra-android-m2repository
- sys-img-armeabi-v7a-android-22
licenses:
- 'android-sdk-preview-license-52d11cd2'
- 'android-sdk-license-.+'
- 'google-gdk-license-.+'
before_install:
- yes | sdkmanager "platforms;android-28"
- echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a -c 32M
- emulator -avd test -no-audio -no-window &
- android-wait-for-emulator
- adb devices
- adb shell input keyevent 82 &
script:
- $FLUTTER --version
- $FLUTTER doctor
- cd $APP
- $FLUTTER_UP devices
- $FLUTTER_UP driver --target=test_driver/app.dart
推荐阅读
- css - Sass 在 React 应用程序中被错误处理
- python - 如何解决这个 Python OpenTimelineIO 安装问题?
- regex - 正则表达式应该只包含
- jquery - jQuery .ready() 函数在加载 iframe 之前运行
- python - 在 Tkinter 中使用 selectimage 时如何从屏幕上隐藏简单的 Checkbutton?
- c# - C# - 我的 ASP.NET MVC 页面总是向我的 JSON POST 请求返回 null
- linux - 如何在 Linux 终端中显示固定的文本行?
- azure - 使用管理员同意端点与使用 promt=consent 授权端点
- deno - 必须提供 --unstable 标志
- javascript - 循环遍历Java脚本中的表中的表