使用 Jacoco 和 Circle CI 生成测试覆盖率失败
Generate test coverage with Jacoco and Circle CI fails
我正在尝试使用此文件 config.yml
在 Circle CI 中生成测试覆盖范围,但构建失败并显示没有连接的设备。
下面是 Circle CI 上产生的错误:
根据我读到的 Circle CI 目前不支持模拟器。
下面是我的 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
CircleCI does not currently support Android 模拟器。根据我的经验,即使有一个有效,也不会持续很长时间。 (Link 自 2018 年 1 月 17 日起)。
话虽如此,您仍然可以收集集成测试覆盖率的一个好方法是利用 Firebase Test Lab.
关于如何使用 CircleCI and Firebase Test Lab.
实际 运行 测试的资源组合
将项目设置为 运行 在 Firebase 测试实验室上进行测试后,您应该能够按如下方式编辑项目:
您需要更新 config.yml 文件的 Firebase 测试任务。请注意,我使用 CIRCLE_BRANCH
和 CIRCLE_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}
在集成测试之后(或在您的选择之前)运行 您将想要 运行 您的单元测试。
- 单元测试完成后 运行 您将需要 运行 合并报告 Jacoco 任务,以便将单元测试覆盖率报告与集成测试覆盖率报告合并。
最后注意:为了在 Firebase 上的测试设备上输出报告,我必须添加一个包含 WRITE_EXTERNAL_STORAGE 权限的调试清单。这是因为我的应用程序在发布时没有使用此权限 builds.If 您的应用程序已经在使用此权限,无需添加调试清单。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
最近 CircleCI 提供了 Android 机器图像,可用于 运行 Android (UI) 测试。 Official documentation
我正在尝试使用此文件 config.yml
在 Circle CI 中生成测试覆盖范围,但构建失败并显示没有连接的设备。
下面是 Circle CI 上产生的错误:
根据我读到的 Circle CI 目前不支持模拟器。
下面是我的 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
CircleCI does not currently support Android 模拟器。根据我的经验,即使有一个有效,也不会持续很长时间。 (Link 自 2018 年 1 月 17 日起)。
话虽如此,您仍然可以收集集成测试覆盖率的一个好方法是利用 Firebase Test Lab.
关于如何使用 CircleCI and Firebase Test Lab.
实际 运行 测试的资源组合将项目设置为 运行 在 Firebase 测试实验室上进行测试后,您应该能够按如下方式编辑项目:
您需要更新 config.yml 文件的 Firebase 测试任务。请注意,我使用
CIRCLE_BRANCH
和CIRCLE_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}
在集成测试之后(或在您的选择之前)运行 您将想要 运行 您的单元测试。
- 单元测试完成后 运行 您将需要 运行 合并报告 Jacoco 任务,以便将单元测试覆盖率报告与集成测试覆盖率报告合并。
最后注意:为了在 Firebase 上的测试设备上输出报告,我必须添加一个包含 WRITE_EXTERNAL_STORAGE 权限的调试清单。这是因为我的应用程序在发布时没有使用此权限 builds.If 您的应用程序已经在使用此权限,无需添加调试清单。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
最近 CircleCI 提供了 Android 机器图像,可用于 运行 Android (UI) 测试。 Official documentation