2013-06-04 3 views
11

Unsere Android App muss automatisiert getestet werden, und unsere Gruppe verwendet Robotium, um das für uns zu erledigen. Dies ist kein Problem für Komponententests, aber wir schreiben auch eine Reihe von End-to-End-Integrationstests, um nicht nur den Client über die Back-End-Server zu testen. Ich habe einige Tests, die das tun, aber wenn möglich, möchte ich sie getrennt von den Komponententests ausgliedern, so dass unsere kontinuierlichen Integrations-Builds keinen laufenden Server benötigen, um ausgeführt zu werden.Wie führt man Integrationstests für Android mit dem neuen Gradle Build System durch?

Wir verwenden das glänzende neue Gradle-Build-System. Ich frage mich, ob ich etwas wie eine Test-only-Variante oder ein Teilprojekt machen könnte, das vom übergeordneten APK abhängt, um es zum Laufen zu bringen. Ich habe versucht, dies mit einem separaten Projekt zusammen zu machen, indem ich die Robotium-Anweisungen zum Testen einer quellfreien Debug-APK verwendete, aber es hat nicht funktioniert. Vielleicht, weil ich auf echter Hardware und nicht auf einem Emulator war. Ich hatte mit dem Emulator kein Glück, auch wenn die Hardware-Beschleunigung installiert war.

Jede Beratung, oder sollte ich nur halten Sie den Atem an und Rolle mit meiner Builds den Integrationsserver erfordert Verfügung zu stehen, wenn Builds passiert sind?

Antwort

11

Nach ihrer Maven instructions alles, was Sie tun müssen, ist robotium-solo als Kompilierung Abhängigkeit hinzuzufügen.

repositories { 
    mavenCentral() 
} 

dependencies { 
    instrumentTestCompile 'com.jayway.android.robotium:robotium-solo:4.2' 
} 

Dies wird sicherstellen, dass Sie die robotium-solo.jar Datei in Ihrem Classpath haben. Definieren Sie anschließend Ihre Tests im Verzeichnis src/instrumentTest und führen Sie gradle build aus. Sehen Sie, ob das funktioniert?

Ich werde helfen, wo ich kann, wie wir aus Maven umgewandelt vor einem Jahr nach Gradle über.

* EDIT OP die Tests wollten getrennt von einem gradle bauen laufen, so dass die Lösung ist eine eigene Quelle, wie so festgelegt, um anzugeben:

sourceSets { 
    integrationTest { 
     // Gives you access to the compiled classes in your tests 
     compileClasspath += main.output 
     runtimeClasspath += main.output 
    } 
} 

dependencies { 
    integrationTestCompile 'com.jayway.android.robotium:robotium-solo:4.2' 
} 

// To run the tests: ./gradlew integrationTest 
task integrationTest(type: Test) { 
    testClassesDir = sourceSests.integrationTest.output.classesDir 
    classpath = sourceSets.integrationTest.runtimeClasspath 
} 

Anmerkung: Ich habe nicht das Android SDK installiert dieser Computer. Wenn main.output nicht funktioniert, versuchen Sie es mit andriod.sourceSets.main.output und sehen, ob das funktioniert.

+0

Ich habe das funktioniert. Was ich möchte, ist eine Möglichkeit, meine serverabhängigen Integrationstests von meinem nicht serverabhängigen Test zu trennen, sodass Jenkins keinen laufenden Produktserver benötigt, um zu funktionieren. – Argyle

+0

Ah, ich verstehe. In diesem Fall sehen Sie sich ein benutzerdefiniertes sourceSet in 'build.gradle' namens' integrationTest' an. Sie haben dann den 'compileIntegrationTest' in Ihrer Abhängigkeitssperre, wo Sie Robotium hinzufügen können. Fügen Sie eine Aufgabe hinzu, um diese Integrationstests auszuführen. Durch Angabe eines benutzerdefinierten sourceSet 'grdle build' werden diese standardmäßig nicht ausgeführt. Um sie auszuführen, müssen Sie eine benutzerdefinierte Aufgabe hinzufügen. Ich überarbeite meine Antwort mit einer Quelle. – Joe

+3

Wäre es nicht "instrumentTestCompile"? –

Verwandte Themen