使用 Travis 进行 Flutter 集成测试 CI

Flutter Integration Tests with Travis CI

1。问题总结

我想要一个 Travis CI 设置,它可以让我在 Android 和 iOS 环境中进行 运行 flutter driver 测试。为此,我希望我必须以某种方式在不同的环境中安装 Flutter、Android 和 iOS。

2。到目前为止我有什么

我能找到的关于这个主题的大多数帖子都非常过时或者具有极其复杂的设置。一些不断出现在我的搜索中的是:

3。我心中的草图

我之前提到的示例中的 scriptinstall 步骤可以替换为 jobsstages。这样,每个阶段都代表一种步骤。 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 在这方面的帮助。

  1. 我还不能使 Android 集成测试工作(下面代码的最后 stage),但至少 iOS 可以工作。
    • Android 由于版本和许可证不同,因此很难正确处理,Apple 在这方面做得更好。
  2. 您将在下面找到的代码是我正在处理的自定义单声道回购设置的一部分。
    • 文件夹结构由一个 app 和一个 packages 文件夹组成。
  3. 我还没有按这两个文件夹分割代码覆盖率,因此此设置目前正在将代码覆盖率从一个文件夹覆盖到另一个文件夹。
  4. 使用顶级 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 应用程序的人提出了类似的问题。

无论如何,这里有一些我在搜索过程中发现的有用资源:

  1. Issue Comment on "Error: Target id is not valid. Use 'android list targets' to get the target ids."
  2. Travis-CI Android 28 licenses have not been accepted
  3. Flutter Samples Travis Setup
  4. @MirceaMatei's Travis Setup Recommendation
  5. Travis Building Android Projects Documentation
  6. 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