Cuối cùng tôi quản lý nó để làm cho nó làm việc và tôi muốn chia sẻ giải pháp với bạn:
phép đo đạc cho buildType của bạn và cấu hình phù hợp SonarQube ví dụ
...
apply plugin: 'jacoco'
...
android {
...
productFlavors {
acceptance {
applicationId packageName + ".acceptance"
buildTypes {
debug {
testCoverageEnabled true
}
}
}
}
}
sonarRunner {
sonarProperties {
property "sonar.host.url", "..."
property "sonar.jdbc.url", sonarDatabaseUrl
property "sonar.jdbc.driverClassName", sonarDatabaseDriverClassName
property "sonar.jdbc.username", sonarDatabaseUsername
property "sonar.jdbc.password", sonarDatabasePassword
property "sonar.sourceEncoding", "UTF-8"
property "sonar.sources", "src/main"
property "sonar.tests", "src/test"
property "sonar.inclusions", "**/*.java,**/*.xml"
property "sonar.import_unknown_files", "true"
property "sonar.java.binaries", "build/intermediates/classes/acceptance/debug"
property "sonar.junit.reportsPath", "build/test-results/acceptanceDebug"
property "sonar.android.lint.report", "build/outputs/lint-results.xml"
property "sonar.java.coveragePlugin", "jacoco"
property "sonar.jacoco.reportPath", "build/jacoco/testAcceptanceDebugUnitTest.exec"
// see steps below on how to get that file:
property "sonar.jacoco.itReportPath", "build/jacoco/jacoco-it.exec"
property "sonar.projectKey", projectKey
property "sonar.projectName", projectName
property "sonar.projectVersion", appVersionName
}
}
thêm dòng sau vào AndroidManifest.xml của bạn
<receiver
android:name=".util.CoverageDataDumper"
tools:ignore="ExportedReceiver">
<intent-filter>
<action android:name="org.example.DUMP_COVERAGE_DATA"/>
</intent-filter>
</receiver>
CoverageDataDumper nên xem xét như thế:
public class CoverageDataDumper extends BroadcastReceiver {
private static final Logger LOG = LoggerFactory.getLogger(CoverageDataDumper.class);
@Override
public void onReceive(Context context, Intent intent) {
try {
Class
.forName("com.vladium.emma.rt.RT")
.getMethod("dumpCoverageData", File.class, boolean.class, boolean.class)
.invoke(null,
new File(App.getContext().getExternalFilesDir(null) + "/coverage.ec"),
true, // merge
false // stopDataCollection
);
}
catch (Exception e) {
LOG.error("Error when writing coverage data", e);
}
}
}
Sau đó chạy trường hợp thử nghiệm Appium của bạn với các ứng dụng hương vị chấp nhận (với các lớp instrumented). Trước khi bạn gọi "Reset App" hoặc "Close Application" đảm bảo để gọi các phương thức sau (chỉ là một dự thảo, nhưng tôi nghĩ rằng bạn sẽ có được ý tưởng):
// intent is "org.example.DUMP_COVERAGE_DATA"
public void endTestCoverage(String intent) {
if (driver instanceof AndroidDriver) {
((AndroidDriver) driver).endTestCoverage(intent, "");
}
}
public void pullCoverageData(String outputPath) {
String coverageFilePath = (String) appiumDriver.getCapabilities().getCapability("coverageFilePath");
if (coverageFilePath != null) {
byte[] log = appiumDriver.pullFile(coverageFilePath);
MobileAppLog.writeLog(new File(outputPath), log);
}
else {
throw new AppiumLibraryNonFatalException(
"Tried to pull the coverage data, but the coverageFilePath wasn't specified.");
}
}
outputPath có thể là ví dụ:/sdcard/Android /data/org.example.acceptance/files/coverage.ec
Bây giờ dữ liệu Jacoco được ghi vào điện thoại thông minh. Tiếp theo, chúng tôi cần tải xuống tệp đó. Bạn có thể sử dụng
appiumDriver.pullFile(logFilePath);
Bây giờ bạn cần phải sao chép các tập tin "jacoco-it.exec" (mà nên luôn luôn nối khi bạn kéo file) vào xây dựng/jacoco/jacoco-it.exec thấy gradle .build trên và chạy
gradlew sonarRunner
Trong SonarQube thêm tích hợp thử nghiệm bảo hiểm widget và bạn sẽ thấy tại một số giá trị ...
Đáng tiếc là mã số bảo hiểm sẽ không hoạt động nếu bạn đang sử dụng retrolambda (như chúng ta làm).Retrolambda sẽ tạo ra các lớp vô danh mà không phải là một phần của tập tin nguồn - vì vậy SonarQube không thể phù hợp với chúng một cách chính xác và hiển thị một phạm vi mã thấp hơn nhiều so với nó thực sự là. Nếu ai đó tìm thấy một giải pháp cho điều đó, tôi sẽ rất hạnh phúc :-)
Tôi có thiếu thứ gì đó hoặc bạn đang sử dụng cả emma và jacoco ở đây? Tôi có một vấn đề tương tự nên câu trả lời này rất thú vị - nhưng tôi không thể hiểu được. – Vish