如何在CircleCI 2.0上正确运行Android UI测试?

9

我正在尝试将我的Android项目升级到CircleCI 2.0。一切都很好,但是在使用模拟器运行Android UI测试时出现了问题。

  • 日志显示com.android.builder.testing.api.DeviceException: No connected devices!
  • 我实际上已经下载了一个模拟器镜像并进行了设置(因为CircleCI的默认Android Docker镜像不带有模拟器):sdkmanager "system-images;android-22;default;armeabi-v7a" && echo "no" | avdmanager create avd -n test -k "system-images;android-22;default;armeabi-v7a" && (emulator64-arm -avd test -noaudio -no-boot-anim -no-window -accel on) &
  • adb devices没有返回任何设备:(
2个回答

26

示例 circle.yml

version: 2
jobs:
  build:
    docker:
      - image: circleci/android:api-26-alpha
    steps:
      - run:
          name: Setup emulator
          command: sdkmanager "system-images;android-22;default;armeabi-v7a" && echo "no" | avdmanager create avd -n test -k "system-images;android-22;default;armeabi-v7a"
      - run:
          name: Launch emulator
          command: export LD_LIBRARY_PATH=${ANDROID_HOME}/emulator/lib64:${ANDROID_HOME}/emulator/lib64/qt/lib && emulator64-arm -avd test -noaudio -no-boot-anim -no-window -accel on
          background: true
      - run:
          name: Run Tests
          command: ./gradlew :demo:connectedAndroidTest

注意:

  • 谷歌没有提供某些特定架构的映像,例如API级别26没有ARM EABI v7a系统映像,这就是为什么我选择上面的 system-images;android-22;default;armeabi-v7a 。要查看哪些映像可用,请运行命令 sdkmanager --list --verbose | grep system-images

  • 你需要设置一个环境变量LD_LIBRARY_PATH,将其与lib64qt路径一起使用,否则你可能会遇到ERROR: Could not load OpenGLES emulation library [lib64OpenglRender]error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file: No such file or directory Exited with code 127。这是由于Android SDK的一个错误

  • 在CircleCI上以后台方式运行命令,不能像通常那样只是在命令末尾添加&,最终将被挂起(HUP)信号终止。正确的方法是说background:true


我按照你的脚本添加步骤复制粘贴,但在模拟器启动时崩溃了。我收到了这个错误:emulator: ERROR: Could not load OpenGLES emulation library [lib64OpenglRender]: lib64OpenglRender.so: cannot open shared object file: No such file or directory emulator: ERROR: Could not load OpenGLES emulation library [lib64OpenglRender]: lib64OpenglRender.so: cannot open shared object file: No such file or directory emulator: ERROR: Could not initialize OpenglES emulation, use '-gpu off' to disable it. - filol
感谢您的快速回复,但是当我应用您的补丁后,虚拟机的问题得到了解决,但Gradle崩溃了:Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)。我猜测这可能与内存问题有关,我会进行调查。是的,我正在使用ARM模拟器。 - filol
非常愉快。是的,那个模拟器问题已经解决了。而您的内存问题将通过添加 _JAVA_OPTIONS: "-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap" 来解决。更多细节,请查看我的文章:https://medium.com/@thyrlian/migrating-circleci-1-2-for-android-77a63219d64c - Jing Li
非常好的文章,但是在设置了_JAVA_OPTIONS之后我仍然遇到了内存错误。 - filol
然后你需要尝试调整它,例如:将-Xms1024m -Xmx1536m -XX:MaxMetaspaceSize=1536m添加到_JAVA_OPTIONS中。 - Jing Li
显示剩余8条评论

4
以下是一个例子config.yml,我曾经使用这个文件在Circle CI上成功运行了我的Android Espresso测试。也许对某些人有用。 config.yml的位置:在项目根目录创建.circleci目录,并将config.yml放在其中。
version: 2
jobs:
  build:
    working_directory: ~/code
    docker:
      - image: circleci/android:api-28-alpha
    environment:
      JVM_OPTS: -Xmx3200m
    steps:
      - checkout
      - restore_cache:
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
         name: Chmod permissions
         command: sudo chmod +x ./gradlew
      - run:
          name: Download Dependencies
          command: ./gradlew androidDependencies
      - save_cache:
          paths:
            - ~/.gradle
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
          name: Lists installed targets
          command: android list target
          environment:
          TERM: dumb
      - run:
          name: Show list of system-images
          command: sdkmanager --list --verbose | grep system-images
      - run:
          name: Setup Emulator
          command: sdkmanager "system-images;android-21;default;armeabi-v7a" && echo "no" | avdmanager create avd -n test -k "system-images;android-21;default;armeabi-v7a"
      - run:
          name: Launch Emulator
          command: |
                  cd ${ANDROID_HOME}/emulator;ls
                  export LD_LIBRARY_PATH=${ANDROID_HOME}/emulator/lib64:${ANDROID_HOME}/emulator/lib64/qt/lib
                  emulator -avd test -no-window -noaudio -no-boot-anim -no-window -accel on
          background: true
      - run:
          name: Wait emulator
          command: |
              circle-android wait-for-boot
              adb shell input keyevent 82
      - run:
          name: Run Espresso UI Tests
          command: ./gradlew :app:connectedDebugAndroidTest
      - store_artifacts:
          path: app/build/reports
          destination: reports
      - store_test_results:
          path: app/build/test-results

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接