首页 > 解决方案 > 使用 Travis CI 进行 Flutter 集成测试

问题描述

一、问题总结

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

2. 到目前为止我所拥有的

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

3. 我心中所想的草图

我之前提到的示例中的scriptandinstall步骤可以替换为jobswith stages。这样,每个阶段将代表一种步骤。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在组织方面也很好的任务。

标签: testingfluttercontinuous-integrationintegration-testingtravis-ci

解决方案


一、概述

感谢@MirceaMatei 和 Maurice McCabe 在这方面提供的帮助。

  1. 我还不能让 Android 集成测试工作(stage下面的最后一个代码),但至少 iOS 工作正常。
    • 由于不同的版本和许可证,Android 更难做对,而苹果在这方面做得更好。
  2. 您将在下面找到的代码是我正在处理的自定义单声道回购设置的一部分。
    • 文件夹结构由一个文件夹app和一个packages文件夹组成。
  3. 我还没有按这两个文件夹对代码覆盖率进行分段,因此此设置当前正在将代码覆盖率从一个文件夹覆盖到另一个文件夹。
  4. 使用顶级install部分使 Travis 为每个阶段重复该设置,从而避免在每个阶段重复执行此操作。

我将在下面分享我当前的(尽管不完整)设置,但通过这个 Github Gist将持续改进,这是一种与社区交互以改进代码的比 StackOverflow 更好的方式——这不是它的目的。

总而言之,我认为 Travis CI 在谈到 Flutter 时真的丢球了——也许是整个 Android。我最近接触的许多从业者大肆宣传的一个更简单的替代方案是Codemagic,它还提供代码签名和对 iOS 和 Android 应用程序商店的自动部署。

2. 有用的资源

我不太喜欢集成测试的 Travis 文档。创建纯 Android 应用程序的人提出了类似的问题。

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

  1. 关于“错误:目标 ID 无效。使用‘android list targets’获取目标 ID”的问题评论。
  2. 带有 Google API 的“所选目标的 --abi armeabi-v7a 无效”
  3. 有没有办法在 Travis CI 构建中启动 android 模拟器?
  4. Travis-CIAndroid 28 licenses have not been accepted
  5. Flutter 示例 Travis 设置
  6. @MirceaMatei 的 Travis 设置建议
  7. Travis 构建 Android 项目文档
  8. 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

推荐阅读