【问题标题】:Flutter Integration Tests with Travis CI使用 Travis CI 进行 Flutter 集成测试
【发布时间】:2020-06-15 01:13:14
【问题描述】:

1。问题总结

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

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

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

  • Test Flutter apps on Travis,作者:叶戈尔·杰巴诺夫。这一个涵盖单元和小部件测试 (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。我心目中的草图

我之前提到的示例中的scriptinstall 步骤可以用jobs 替换为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

如果我可以为dartfmt 任务创建一个stage,这在组织方面也会很好。

【问题讨论】:

    标签: testing flutter continuous-integration integration-testing travis-ci


    【解决方案1】:

    1。概述

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

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

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

    总而言之,我认为 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. “Invalid --abi armeabi-v7a for the selected target” with Google APIs
    3. Is there a way to start android emulator in Travis CI build?
    4. Travis-CI Android 28 licenses have not been accepted
    5. Flutter Samples Travis Setup
    6. @MirceaMatei's Travis Setup Recommendation
    7. Travis Building Android Projects Documentation
    8. Maurice McCabe's Unit and Integration Tests with Travis Article on Medium

    3。守则

    请不要在此处发布代码改进建议,而是在 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
    

    【讨论】:

    • 干得好。分享就是关怀!你说得对,对于 Android,由于许可曲折,我避免包含集成部分。
    • 在我上面分享的设置中,我确实设法摆脱了许可证错误。我得到的错误与EGLCheck failed: android_surface_. Could not create an OpenGL, Vulkan or Software surface to setup rendering. 有关。之后舞台卡住了。
    【解决方案2】:

    你可以看看这个项目

    我认为它具有您正在寻找的所有组件。它是一个 Dart 包,在解决方案中包含一个用于 Flutter 的 example 集成项目。

    CI 管道是为 Travis CI 构建的(主要基于 Maurice McCabe's article)。 travis.yml 文件可能包含您需要的所有部分。

    【讨论】:

    • 非常好。巧合的是,我从昨天开始又在做这件事。我将尝试将您的解决方案纳入我的尝试中,看看它是否有效,然后我将分享我的完整解决方案,以便我们彼此学习。顺便说一句,你没有为 Android 创建一个舞台,是吗? McCabe 的文章有一个,也许你设法让它工作但没有费心把它放在那里?
    • 我会在今天甚至明天投资来完成这项工作,但我可能会更改我的 CI/CD 以使用 Codemagic。它更快,因为它针对 Flutter 进行了优化,更简单,而且我与之交谈过的其他一些人已经使用 Codemagic。 Travis 会很好,因为它是编程的标准,但坦率地说,当谈到 Flutter 和 Dart 时,他们真的丢球了。
    猜你喜欢
    • 2017-11-12
    • 2021-01-15
    • 1970-01-01
    • 2020-07-27
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多