2013-11-28 5 views
13

Приложение, над которым я работаю, строится с помощью Gradle. Я пытаюсь добавить Espresso в качестве зависимости для тестов приборов. Само приложение имеет несколько зависимостей, одним из которых является Guava 15.0. Чтобы сделать эту работу, я использую версию Espresso с явными зависимостями и исключаю вложенную Guava (вместо этого использую мой собственный).Интеграция эспрессо с Proguard и Gradle

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

Когда я пытаюсь построить с gradle connectedInstrumentTest, я получаю ошибки, связанные с отсутствующими методов и классов.

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.** { *; } к моему Proguard конфигурации делает все отлично работает. Похоже, что Proguard анализирует классы, используемые главным приложением, и не ищет использования зависимостей теста инструмента. Методы/классы, которые не используются моим основным приложением, но которые требуются для тестирования прибора, как представляется, оптимизированы.

Как я могу заставить Proguard сохранить классы/методы Guava, необходимые для Espresso и его зависимостей? Кажется нецелесообразным указывать их все вручную (существует много обычаев), и все они побеждают цель Proguard.

ответ

-6

Не прогаживайте свои апки (ов) во время тестирования, если только вам это не нужно.

+5

К сожалению, приложение не выполняет шаг dex без proguard из-за слишком большого количества методов (через библиотеки). Существует достаточная свобода для добавления исключений Guava, но подобные ошибки могут возникать и в других местах (т. Е. В любое время, когда методы/классы используются при тестировании, но не в основном приложении). – antonyt

11

Вот что работает для меня:

В build.gradle я добавил эту строку в моей секции defaultConfig:

testProguardFile "test-proguard-rules.pro"

Затем я создал test-proguard-rules.pro со следующим содержимым :

-dontobfuscate 
-dontwarn 

Это говорит Gradle использовать эту отдельную конфигурацию Proguard для тестового APK, один содержащий ваш Instrume тесты. В этом случае вы говорите proguard, чтобы не обфускать ваш тест apk, который, вероятно, вы хотите. Основной apk, который вы тестируете, по-прежнему запутывается с использованием существующей конфигурации proguard.

+2

Как вы справляетесь со всеми вызовами, которые тест apk делает в основное приложение. Поскольку класс и методы в главном приложении были бы запутаны proguard, как тестовое приложение вызовет эти запутанные методы/класс? –

 Смежные вопросы

  • Нет связанных вопросов^_^