Finalmente sono riuscito a farlo funzionare e voglio condividere la soluzione con voi:
abilitare la strumentazione per il vostro buildtype e configurare SonarQube conseguenza esempio
...
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
}
}
aggiungere il seguente al vostro AndroidManifest.xml
<receiver
android:name=".util.CoverageDataDumper"
tools:ignore="ExportedReceiver">
<intent-filter>
<action android:name="org.example.DUMP_COVERAGE_DATA"/>
</intent-filter>
</receiver>
CoverageDataDumper dovrebbe essere simile che:
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);
}
}
}
quindi eseguire il test case Appium con l'applicazione sapore accettazione (con le classi di strumentazione). Prima di chiamare "Reset App" o "Chiudi applicazione" fare in modo di chiamare i seguenti metodi (solo un progetto, ma penso che si ottiene l'idea):
// 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 potrebbe essere per esempio:/sdcard/Android /data/org.example.acceptance/files/coverage.ec
Ora i dati di Jacoco vengono scritti sullo smartphone. Quindi dobbiamo scaricare quel file. È possibile utilizzare
appiumDriver.pullFile(logFilePath);
Ora è necessario copiare il file "jacoco-it.exec" (che dovrebbe essere sempre allegato quando si tira il file) in build/jacoco/jacoco-it.exec vedere Gradle .build sopra e gestiscono
gradlew sonarRunner
Nel SonarQube aggiungere l'integrazione di prova copertura widget e si dovrebbe vedere ora alcuni valori ...
Purtroppo copertura del codice non funziona se si utilizza retrolambda (come noi fare).Retrolambda genererà classi anonime che non fanno parte dei file di origine, quindi SonarQube non può corrispondere correttamente a loro e visualizza una copertura del codice molto più bassa di quanto non sia in realtà. Se qualcuno trova una soluzione per questo, sarei molto felice :-)
mi sto perdendo qualcosa, o stai usando sia Emma e jacoco qui? Ho un problema simile, quindi questa risposta è molto interessante, ma non riesco a capire. – Vish