使用 Travis 进行 Flutter 集成测试 CI
Flutter Integration Tests with Travis CI
1。问题总结
我想要一个 Travis CI 设置,它可以让我在 Android 和 iOS 环境中进行 运行 flutter driver
测试。为此,我希望我必须以某种方式在不同的环境中安装 Flutter、Android 和 iOS。
2。到目前为止我有什么
我能找到的关于这个主题的大多数帖子都非常过时或者具有极其复杂的设置。一些不断出现在我的搜索中的是:
Test Flutter apps on Travis,作者: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
in the Flutter samples repo。不过那里的设置对我来说似乎很复杂。
- 我能得到的最接近我想要的东西与 Maurice McCabe 的 Flutter unit, widget and integration testing with IOS and Android emulators on Travis-CI 相似。
- 同样,这似乎过于复杂和过时了。
3。我心中的草图
我之前提到的示例中的 script
和 install
步骤可以替换为 jobs
和 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
如果我可以为 dartfmt
任务创建一个 stage
,这在组织方面也会很好。
你可以看看这个项目
我认为它具有您要查找的所有组件。它是一个 Dart 包,在解决方案中有一个 example Flutter 集成项目。
CI 管道是为 Travis CI 构建的(主要基于 Maurice McCabe's article). It's possible that the travis.yml 文件包含您需要的所有部分。
1。概述
感谢@MirceaMatei 和 Maurice McCabe 在这方面的帮助。
- 我还不能使 Android 集成测试工作(下面代码的最后
stage
),但至少 iOS 可以工作。
- Android 由于版本和许可证不同,因此很难正确处理,Apple 在这方面做得更好。
- 您将在下面找到的代码是我正在处理的自定义单声道回购设置的一部分。
- 文件夹结构由一个
app
和一个 packages
文件夹组成。
- 我还没有按这两个文件夹分割代码覆盖率,因此此设置目前正在将代码覆盖率从一个文件夹覆盖到另一个文件夹。
- 使用顶级
install
部分使 Travis 为每个阶段重复该设置,从而避免为每个阶段重复执行此操作。
I'm sharing my current — albeit incomplete — setup below, but continuous improvement will happen through this Github Gist, which is a much better way of interacting with the community to improve code than Whosebug — it's not its purpose.
总而言之,我认为 Travis CI 在谈到 Flutter 时真的失误了——也许 Android 总的来说。 Codemagic 是我最近接触的许多从业者大肆宣传的一种更简单的替代方案,它还提供代码签名和自动部署到 iOS 和 Android 应用程序商店。
2。有用的资源
我不太喜欢 Travis 的集成测试文档。创建纯 Android 应用程序的人提出了类似的问题。
无论如何,这里有一些我在搜索过程中发现的有用资源:
- Issue Comment on "Error: Target id is not valid. Use 'android list targets' to get the target ids."
- Travis-CI
Android 28 licenses have not been accepted
- Flutter Samples Travis Setup
- @MirceaMatei's Travis Setup Recommendation
- Travis Building Android Projects Documentation
- Maurice McCabe's Unit and Integration Tests with Travis Article on Medium
3。代码
请不要post这里的代码改进建议,而是在the 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
1。问题总结
我想要一个 Travis CI 设置,它可以让我在 Android 和 iOS 环境中进行 运行 flutter driver
测试。为此,我希望我必须以某种方式在不同的环境中安装 Flutter、Android 和 iOS。
2。到目前为止我有什么
我能找到的关于这个主题的大多数帖子都非常过时或者具有极其复杂的设置。一些不断出现在我的搜索中的是:
Test Flutter apps on Travis,作者: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
in the Flutter samples repo。不过那里的设置对我来说似乎很复杂。 - 我能得到的最接近我想要的东西与 Maurice McCabe 的 Flutter unit, widget and integration testing with IOS and Android emulators on Travis-CI 相似。
- 同样,这似乎过于复杂和过时了。
3。我心中的草图
我之前提到的示例中的 script
和 install
步骤可以替换为 jobs
和 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
如果我可以为 dartfmt
任务创建一个 stage
,这在组织方面也会很好。
你可以看看这个项目
我认为它具有您要查找的所有组件。它是一个 Dart 包,在解决方案中有一个 example Flutter 集成项目。
CI 管道是为 Travis CI 构建的(主要基于 Maurice McCabe's article). It's possible that the travis.yml 文件包含您需要的所有部分。
1。概述
感谢@MirceaMatei 和 Maurice McCabe 在这方面的帮助。
- 我还不能使 Android 集成测试工作(下面代码的最后
stage
),但至少 iOS 可以工作。- Android 由于版本和许可证不同,因此很难正确处理,Apple 在这方面做得更好。
- 您将在下面找到的代码是我正在处理的自定义单声道回购设置的一部分。
- 文件夹结构由一个
app
和一个packages
文件夹组成。
- 文件夹结构由一个
- 我还没有按这两个文件夹分割代码覆盖率,因此此设置目前正在将代码覆盖率从一个文件夹覆盖到另一个文件夹。
- 使用顶级
install
部分使 Travis 为每个阶段重复该设置,从而避免为每个阶段重复执行此操作。
I'm sharing my current — albeit incomplete — setup below, but continuous improvement will happen through this Github Gist, which is a much better way of interacting with the community to improve code than Whosebug — it's not its purpose.
总而言之,我认为 Travis CI 在谈到 Flutter 时真的失误了——也许 Android 总的来说。 Codemagic 是我最近接触的许多从业者大肆宣传的一种更简单的替代方案,它还提供代码签名和自动部署到 iOS 和 Android 应用程序商店。
2。有用的资源
我不太喜欢 Travis 的集成测试文档。创建纯 Android 应用程序的人提出了类似的问题。
无论如何,这里有一些我在搜索过程中发现的有用资源:
- Issue Comment on "Error: Target id is not valid. Use 'android list targets' to get the target ids."
- Travis-CI
Android 28 licenses have not been accepted
- Flutter Samples Travis Setup
- @MirceaMatei's Travis Setup Recommendation
- Travis Building Android Projects Documentation
- Maurice McCabe's Unit and Integration Tests with Travis Article on Medium
3。代码
请不要post这里的代码改进建议,而是在the 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