使用 Jacoco 和 Circle CI 生成测试覆盖失败

Lut*_*ris 4 java android jacoco circleci

我正在尝试使用此文件在 Circle CI 中生成测试覆盖率config.yml,但构建失败并显示没有连接的设备。以下是 Circle CI 上生成的错误:

在此处输入图片说明

根据我所读到的,Circle CI 目前不支持 Emulators。

以下是我的config.yml文件:

version: 2
jobs:
  build:
    working_directory: ~/ConvergeLevelApp
    docker:
      - image: circleci/android:api-25-alpha
    environment:
      JVM_OPTS: -Xmx3200m
      CC_TEST_REPORTER_ID: 403xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      ADB_INSTALL_TIMEOUT: 60
    steps:
      - checkout
      - restore_cache:
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
          name: Download Dependencies
          command: ./gradlew androidDependencies

      - save_cache:
          paths:
            - ~/.gradle
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}

      - run:
          name: Setup Code Climate test-reporter
          command: |
                  curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
                  chmod +x ./cc-test-reporter

      - run:
          name: Run Tests
          command: ./gradlew lint test

      - store_artifacts:
          path: app/build/reports
          destination: reports

      - store_test_results:
          path: app/build/test-results

      - run:
          name: Generate JaCoCo report
          command: ./gradlew jacocoTestReport
      - run:
          name: Upload coverage to code climate
          command: |
                  export JACOCO_SOURCE_PATH=app/src/main/java
                  ./cc-test-reporter format-coverage app/build/reports/coverage/debug/report.xml -t jacoco
                  ./cc-test-reporter upload-coverage
Run Code Online (Sandbox Code Playgroud)

Lor*_*pid 5

CircleCI目前不支持Android 模拟器。根据我的经验,即使有一种有效的方法,它也不会起作用很长时间。(链接自 2018 年 1 月 17 日)。

话虽如此,您仍然可以收集集成测试覆盖率的一个好方法是利用Firebase 测试实验室

有关如何使用CircleCI 和 Firebase 测试实验室实际运行测试的资源组合。

设置项目以在 Firebase 测试实验室上运行测试后,您应该能够按如下方式编辑项目:

  1. 您需要更新 config.yml 文件的 Firebase 测试任务。请注意,我使用CIRCLE_BRANCHCIRCLE_BUILD_NUM来确保将结果保存在每个构建的结果存储桶中的特定位置。您将需要替换YOUR_LOCATION为您的实际存储桶位置和DEVICE运行 Firebase 测试的设备。

    您还需要替换LOCATION_OF_ANDROID_TESTS为用于运行您的仪器测试的 Jacoco 命令(您可以通过在本地运行您的仪器测试然后查找此名称来找到它。)这些gsutil命令设置为从它们所在的存储桶中提取覆盖文件流,然后删除存储桶中的文件夹。如果您使用该gsutil -m -o命令,则可以更快地完成此操作。

    值得一提的是,这会将构建失败的结果保留在存储桶中(因此您可能需要将该命令移出以确保您的存储桶不会塞满数据)。

    sudo pip install -U crcmod
    sudo gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json
    sudo gcloud --quiet config set project ${GOOGLE_PROJECT_ID}
    sudo gcloud firebase test android run \
               --type instrumentation \
               --app PATH_TO_APK \
               --test PATH_TO_TEST_APK \
               --device DEVICE_OF_YOUR_CHOOSING \
               --environment-variables coverage=true,coverageFile="/sdcard/coverage.ec" \
               --directories-to-pull=/sdcard \
               --results-dir=${CIRCLE_BRANCH}_${CIRCLE_BUILD_NUM}
    sudo gsutil -m cp -r -U gs://test-lab-YOUR_LOCATION/${CIRCLE_BRANCH}_${CIRCLE_BUILD_NUM}/DEVICE/artifacts/coverage.ec app/build/outputs/code_coverage/LOCATION_OF_ANDROID_TESTS/connected/coverage.ec
    sudo gsutil rm -r gs://test-lab-YOUR_LOCATION/${CIRCLE_BRANCH}_${CIRCLE_BUILD_NUM}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在集成测试运行之后(或之前),您需要运行单元测试。

  3. 单元测试运行后,您需要运行合并报告 Jacoco 任务,以便将单元测试覆盖率报告与集成测试覆盖率报告合并。

最后说明:为了在 Firebase 上的测试设备上输出报告,我必须添加一个包含 WRITE_EXTERNAL_STORAGE 权限的调试清单。这是因为我的应用程序未在发布版本中使用此权限。如果您的应用程序已在使用此权限,则无需添加调试清单。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)