2013-10-10 11 views
5

Używam testów urządzenia z Androidem w wersji awesome plugin from Jake Wharton. Mój cel polegający na podjęciu próby uruchomienia tych testów jednostkowych to szybkość (szybkie informacje zwrotne TDD i wszystkie).Przeprowadź pojedynczy test systemu Android (jednostka) ze stopniowania bez ładowania innych zależności projektu.

Ja kieruję go skonfigurować poprawnie i jakieś przykładowe testy uruchomione w następujący sposób:

./gradlew test 

Ilekroć uruchomić testy choć zauważyć następujący wynik:

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 wydaje ładuj WSZYSTKIE zależności dla mojego projektu.

mojego testu próbki jest następujący:

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); 
    } 
} 

Ten test powinien rzeczywiście wziąć ułamek sekundy, aby uruchomić. Rozumiem, że całe to wstępne ładowanie zależności projektu powoduje je.

W dobre dni, chciałbym się upewnić, mam co potrzebne w CLASSPATH i po prostu uruchomić coś takiego:

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

biorąc pod uwagę to jest Android projekt z Gradle, jestem przy założeniu, bym zrobić coś trochę innego, jak tworzyć specyficzne zadania w pliku gradle build, które zawierają tylko moje pliki testowe do mojego przykładowego projektu, a następnie uruchomić polecenie gradle ./gradlew taskName?

Pytanie: Czy jest możliwe, aby uruchomić jeden test „AdditionOperationsTest” w kontekście mojego projektu (com.mycompany.mysampleapp) sam tak, że nie ładuje zewnętrznych zależności projektowych

oto jak moja konfiguracja pliki aktualnie wygląda tak:

# 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

Próbuję rozwiązać ten sam problem. Myślę, że rzeczą do zrobienia jest posiadanie projektu wielomodułowego, aby testy istniały w osobnym module, ale mam nadzieję, że nie będzie to konieczne. – Turnsole

+0

Tak, NAPRAWDĘ nie chcę łamać moich testów na różne moduły. Czuję, że straciłbym na tym, że zmieniłem cały nasz projekt na gradulacyjny. Mam nadzieję, że jest to po prostu jakiś głupi parametr, który muszę dodać lub zadanie, które muszę zadeklarować, że zignoruje zewnętrzne zależności projektu i przeprowadzi dokładny test, na który wskażę i tylko wymagane zależności. –

Odpowiedz

4

Powinieneś być w stanie to zrobić przy użyciu -acommand line option (bez przebudowy zależnościami projektu). Wykonanie gradle -a test powinno spowodować, że projekty nie będą przebudowywane.

EDIT: Jak wspomniano poniżej można znacznie poprawić wydajność Gradle budować za pomocą Gradle daemon.

+0

Dzięki Benjamin, wow, to jest w porządku. Dodanie argumentu upewniło, że biblioteka facebook nie została przebudowana. Zauważam jednak, że zgoliłem tylko kilka milisekund. Nie dramatycznie sprawiłam, że mój test działa szybciej :(Jakieś wskazówki, które możesz zapewnić, aby test działał szybko, np. Jak leniwy ładunek zależności tylko wtedy, gdy jest używany? Test, którego używam, nie wykorzystuje żadnej części "frameworka", a więc Powinienem był działać bardzo szybko Witam –

+0

Nie jestem tego świadomy Jak długo trwa test do uruchomienia? Możesz zastanowić się, dlaczego tak naprawdę trwa to tak długo, jak to trwa w danej chwili (np. do systemów zewnętrznych). –

+0

Całkowity czas: 10,612 sekund. Myślę, że jest to bardziej związane z konfiguracją, ponieważ klasa testowa na wypowiedź jest po prostu obojętną klasą testową (dokładnie taką, jaką napisałem w pytaniu), która powinna działać natychmiastowo. Myślę, że gradle rekalkuluje/rekompiluje lub robi coś, aby przygotować cały projekt przed uruchomieniem pojedynczego testu. –