2013-11-28 3 views
13

Die App, an der ich arbeite, wird mit Gradle erstellt. Ich versuche, Espresso als Abhängigkeit für Instrumententests hinzuzufügen. Die App selbst hat einige Abhängigkeiten, von denen Guava 15.0 ist. Um dies zu erreichen, verwende ich die Version von Espresso mit expliziten Abhängigkeiten und schließe das gebündelte Guava aus (benutze stattdessen mein eigenes).Integrieren von Espresso mit Proguard und Gradle

dependencies { 
    ... 
    instrumentTestCompile fileTree(dir: 'libs/espresso-dependencies', include: '*.jar') 
    compile 'com.google.guava:guava:15.0' 
    ... 
} 

Wenn ich versuche, mit gradle connectedInstrumentTest zu bauen, bekomme ich Fehler fehlende Methoden und Klassen zusammen.

java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState 
at com.google.android.apps.common.testing.ui.espresso.base.InputManagerEventInjectionStrategy.<init>(InputManagerEventInjectionStrategy.java:35) 

-keep class com.google.common.** { *; } meiner Proguard Config Hinzufügen macht alles funktionieren. Was passiert, ist, dass Proguard nur die Klassen analysiert, die von der Haupt-App verwendet werden, und nicht nach der Verwendung durch die Abhängigkeiten des Instrument-Tests sucht. Methoden/Klassen, die nicht von meiner Haupt-App verwendet werden, aber für die Instrumententests benötigt werden, scheinen weit entfernt zu sein.

Wie kann ich Proguard veranlassen, die von Espresso und seinen Abhängigkeiten benötigten Guava-Klassen/Methoden beizubehalten? Es scheint nicht praktisch zu sein, sie alle manuell zu spezifizieren (es gibt viele Verwendungen), und sie alle zu behalten, widerspricht dem Zweck von Proguard.

Antwort

-6

Progardiere deine APK (s) während des Tests nicht, außer du musst es unbedingt tun.

+5

Leider schlägt die App aufgrund von zu vielen Methoden (über Bibliotheken) den Dex-Schritt ohne Proguard fehl. Es gibt genügend Spielraum, um Guava-Ausschlüsse hinzuzufügen, aber ähnliche Fehler können auch an anderen Stellen auftreten (d. H. Jederzeit, wenn Methoden/Klassen beim Testen verwendet werden, aber nicht in der Haupt-App). – antonyt

11

Hier ist, was für mich gearbeitet:

In build.gradle ich diese Zeile in meinem DefaultConfig Abschnitt hinzugefügt:

testProguardFile "test-proguard-rules.pro"

Dann habe ich mit folgendem Inhalt test-proguard-rules.pro :

Dies sagt Gradle, diese separate Proguard-Konfiguration für Ihre Test-APK zu verwenden, die Ihr Gerät enthält Tests. In diesem Fall sagst du progard, deine Test-APK nicht zu verschleiern, was wahrscheinlich das ist, was du willst. Die Haupt-APK, die Sie testen, wird immer noch mit Ihrer vorhandenen Proguard-Konfiguration verschleiert.

+2

Wie gehen Sie mit allen Anrufen um, die die Test-App an die Haupt-App sendet? Da die Klasse und Methoden in der Haupt-App durch Proguard verschleiert worden wären, wie wird die App diese verschleierten Methoden/Klassen testen? –