2013-10-10 11 views
5

Ich verwende die awesome plugin from Jake Wharton für Android-Unit-Tests. Mein Ziel, sich die Mühe zu machen, diese Komponententests laufen zu lassen, ist Geschwindigkeit (TDD schnelle Rückmeldung und alle).Führen Sie einen einzelnen Android (Einheit) Test von Gradle ohne andere Projektabhängigkeiten laden

Ich habe verwalten sie richtig konfigurieren und einige Beispieltests ausgeführt haben, wie folgt:

./gradlew test 

Immer, wenn ich die Tests laufen, obwohl ich die folgende Ausgabe bemerken:

Relying on packaging to define the extension of the main artifact has been deprecated and is scheduled to be removed in Gradle 2.0 
The Test.testReportDir property has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the Test.getReports().getHtml().getDestination() property instead. 
The TaskContainer.add() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the create() method instead. 
:mySampleApp:preBuild UP-TO-DATE 
:mySampleApp:preDebugBuild UP-TO-DATE 
:mySampleApp:preReleaseBuild UP-TO-DATE 
:libraries:facebook:compileLint 
:libraries:facebook:copyReleaseLint UP-TO-DATE 
:libraries:facebook:mergeReleaseProguardFiles UP-TO-DATE 
:libraries:facebook:packageReleaseAidl UP-TO-DATE 
:libraries:facebook:preBuild UP-TO-DATE 
:libraries:facebook:preReleaseBuild UP-TO-DATE 
:libraries:facebook:prepareReleaseDependencies 
:libraries:facebook:compileReleaseAidl UP-TO-DATE 
:libraries:facebook:compileReleaseRenderscript UP-TO-DATE 
:libraries:facebook:generateReleaseBuildConfig UP-TO-DATE 
:libraries:facebook:mergeReleaseAssets UP-TO-DATE 
:libraries:facebook:mergeReleaseResources UP-TO-DATE 
:libraries:facebook:processReleaseManifest UP-TO-DATE 
:libraries:facebook:processReleaseResources UP-TO-DATE 
:libraries:facebook:generateReleaseSources UP-TO-DATE 
:libraries:facebook:compileRelease UP-TO-DATE 
:libraries:facebook:processReleaseJavaRes UP-TO-DATE 
:libraries:facebook:packageReleaseJar UP-TO-DATE 
:libraries:facebook:packageReleaseLocalJar UP-TO-DATE 
:libraries:facebook:packageReleaseRenderscript UP-TO-DATE 
:libraries:facebook:packageReleaseResources UP-TO-DATE 
:libraries:facebook:bundleRelease UP-TO-DATE 
:mySampleApp:prepareComAndroidSupportAppcompatV71800Library UP-TO-DATE 
:mySampleApp:preparemySampleAppandroidLibrariesFacebookUnspecifiedLibrary UP-TO-DATE 
:mySampleApp:prepareDebugDependencies 
:mySampleApp:compileDebugAidl UP-TO-DATE 
:mySampleApp:compileDebugRenderscript UP-TO-DATE 
:mySampleApp:generateDebugBuildConfig UP-TO-DATE 
:mySampleApp:mergeDebugAssets UP-TO-DATE 
:mySampleApp:mergeDebugResources UP-TO-DATE 
:mySampleApp:processDebugManifest UP-TO-DATE 
:mySampleApp:processDebugResources UP-TO-DATE 
:mySampleApp:generateDebugSources UP-TO-DATE 

Gradle scheint Laden Sie ALLE Abhängigkeiten für mein Projekt.

Mein Muster Test ist wie folgt:

package com.mycompany.mysampleapp; 

import org.junit.Test; 

import static org.fest.assertions.api.Assertions.assertThat; 

public class AdditionOperationsTest { 
    @Test public void testModulus() { 
    assertThat(1).isEqualTo(1); 
    } 
} 

Dieser Test sollte eigentlich einen Bruchteil einer Sekunde in Anspruch nehmen. Mein Verständnis ist, dass all das Pre-Loading der Abhängigkeiten des Projekts es aufhält.

In den guten Tagen, würde ich sicherstellen, dass ich habe, was ich in der CLASSPATH müssen und laufen nur so etwas wie:

javac src/test/java/main/java/com/micromobs/pkk/AdditionOperationsTest.java 
java org.junit.runner.JUnitCore com.micromobs.pkk.AdditionOperationsTest 

Betrachtet man dies ein Android-Projekt mit gradle ist, gehe ich davon aus, ich habe würde etwas anderes zu tun, wie zum Beispiel spezifische Aufgaben in der Gradle-Build-Datei zu erstellen, die nur meine Testdateien für mein Beispielprojekt enthalten, und dann einen Gradle-Befehl ausführen ./gradlew taskName?

Frage: Ist es möglich, den einzigen Test „AdditionOperationsTest“ im Rahmen meines Projektes (com.mycompany.mysampleapp) allein zu laufen, so dass es nicht die externen Projektabhängigkeiten nicht geladen

Hier ist, wie meine Konfiguration Dateien suchen derzeit wie:

# settings.gradle 
include ':libraries:gradle-android-test-plugin' 
include ':libraries:facebook', ':mysampleapp' 

# build.gradle 
... 
apply plugin: 'android-test' 

dependencies { 
    testCompile 'junit:junit:4.10' 
    testCompile 'org.robolectric:robolectric:2.1.+' 
    testCompile 'com.squareup:fest-android:1.0.+' 
} 

# location of my test files: 
androidproj/mysampleapp/src/test/java/main/com/mycompany/mysampleapp/AdditionOperationsTest.java 
+0

Ich versuche, das gleiche Problem zu lösen. Ich denke, es geht darum, ein Multi-Modul-Projekt zu haben, so dass die Tests in einem separaten Modul existieren, aber ich hoffe, dass das nicht notwendig sein wird. – Turnsole

+0

Ja, ich möchte meine Tests wirklich nicht in verschiedene Module aufteilen. Ich denke, ich würde die Güte verlieren, unser gesamtes Projekt auf den Punkt gebracht zu haben. Ich hoffe, dass dies nur ein dummer Parameter ist, den ich hinzufügen muss, oder eine Aufgabe, die ich deklarieren muss, die externen Projektabhängigkeiten ignoriert und den genauen Test ausführt, auf den ich zeige, und nur Abhängigkeiten, die er benötigt. –

Antwort

4

Sie sollen (Rebuild von Projektabhängigkeiten no) unter Verwendung des -acommand line option zu tun, so in der Lage sein. Die Ausführung von gradle -a test sollte dazu führen, dass die Projekte libraries:facebook und mysampleapp nicht neu erstellt werden.

BEARBEITEN: Wie unten erwähnt, können Sie die Leistung Ihres Gradle Builds deutlich verbessern, indem Sie Gradle daemon verwenden.

+0

Danke Benjamin, wow, das ist völlig richtig. Durch Hinzufügen des Arguments wurde sichergestellt, dass die Facebook-Bibliothek nicht neu erstellt wurde. Mir fällt jedoch auf, dass ich mich nur ein paar Sekunden rasiert habe. Hat meinen Test nicht dramatisch beschleunigen lassen :(Irgendwelche Tipps, die man geben kann, um den Test schnell laufen zu lassen zB wie ein lähmendes Laden von Abhängigkeiten nur wenn benutzt? Der Test habe ich keinen Teil des "Frameworks" benutzt und so Eigentlich hätte ich sehr schnell laufen sollen Prost. –

+0

Nicht, dass ich mir dessen bewusst bin.Wie lange dauert es, bis der Test läuft? Vielleicht möchten Sie sich ansehen, warum es tatsächlich so lange dauert, wie es im Moment dauert zu externen Systemen). –

+0

Gesamtzeit: 10.612 Sek. Ich denke, dass es mehr mit dem Setup zu tun hat, weil die Testklasse pro Aussage nur eine Dummy-Testklasse ist (genau die gleiche wie die, die ich in der Frage geschrieben habe), die sofort ausgeführt werden sollte. Ich denke, Gradle ist Neuberechnen/Neukompilieren oder etwas tun, um das gesamte Projekt vorzubereiten, bevor Sie einen einzigen Test durchführen. –

Verwandte Themen