2014-09-24 2 views
0

Я впервые создал функциональный тест для своего приложения, и он отлично работает. Затем я добавил модульные тесты (используя Robolectric + Roboguice + Mockito), и они также отлично работают. Тем не менее, теперь мой функциональный тест даже не запускается, исключая исключение, например, Caused by: java.lang.NoClassDefFoundError: com.bla.bla.MainActivityПроект Gradle для модульных и функциональных тестов

Мне потребовалось несколько часов (и удача, чтобы прочитать подсказку где-нибудь в SO, но я потерял ее, и я не могу ссылаться на нее), что мне нужно для проверки вывода logcat для реальной информации. Это указывало на то, что есть много проблем, потому что код скомпилирован с теневыми классами из Robolectric ... Поэтому, чтобы исправить это, я думаю, мне нужно создать две отдельные задачи (или хотя бы одну новую), которые будут обрабатываться отдельно составление модульных тестов и компиляция функционального теста.

Мой модульных тестов в:
\src\androidTest\java\com\bla\bla\tests
и мой функциональный тест (надеюсь, это будет тесты скоро) находится в:
\src\androidTest\java\com\bla\bla\tests\functional

Так что шаги, необходимые для выполнения этого? Я думаю, мне нужно создать новый sourceSet, но как определить, какие файлы должны быть там, и мне нужны только тестовые файлы (только те, что в \ src \ androidTest \ java \ com \ bla \ bla \ tests \ functional), или мне нужно также файлы исходного кода приложения. Я искал что-то вроде примеров быстрого запуска, что-то документированное, чтобы я мог легко его переварить (потому что я уже потерял день для этой проблемы), но безуспешно. Возможно, я не ищу правильные ключевые слова, поэтому, если вы знаете что-то вроде этого, ссылка будет очень полезна.

Вот мой build.gradle файл:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 19 
    buildToolsVersion "19.1.0" 

    defaultConfig { 
     minSdkVersion 17 
     targetSdkVersion 17 
     applicationId "com.bla.bla" 
     testApplicationId "com.bla.bla.tests" 
    } 
    buildTypes { 
     release { 
      runProguard false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 

    sourceSets { 
     instrumentTest.setRoot('src/androidTest') 
    } 

    packagingOptions { 
     exclude 'LICENSE.txt' 
    } 

} 

dependencies { 

    androidTestCompile files('libs/robolectric-2.4-jar-with-dependencies.jar') 
    androidTestCompile files('libs/robotium-solo-5.2.1.jar') 
    androidTestCompile 'junit:junit:4.11' 
    androidTestCompile files('libs/javax.inject-1.jar') 
    androidTestCompile files('libs/jsr305-1.3.9.jar') 
    androidTestCompile files('libs/mockito-core-1.9.5.jar') 
    androidTestCompile files('libs/roboguice-2.0.jar') 


    compile files('libs/weberknecht.jar') 
    compile files('libs/gson-2.2.4.jar') 
    compile files('libs/javax.inject-1.jar') 
    compile files('libs/guice-3.0-no_aop.jar') 
    compile files('libs/roboguice-2.0.jar') 
} 

Я использую:

  • Android Studio 0.8.10
  • com.android.tools.build:gradle:0.12.2 (Я думаю, что это плагин android gradle)
  • gradle 1.12

ответ

0

Я создал проект в GitHub (в основном для личного использования, но не стесняйтесь его копировать). https://github.com/tas-morf/AndroidUnitTestTemplate Он имеет как модульные тесты (с Robolectric и Mockito), так и контрольно-измерительные тесты (с эспрессо). В качестве бонуса он также имеет интеграцию с волейболом. Я просто использую это, потому что он помогает мне запускать большинство моих проектов, но скрипт сборки и структура папок должны отвечать на ваши вопросы. Я также включил все ссылки на другие проекты, которые помогли достичь этого. Имейте в виду, что это незавершенное производство.

+0

Как вы собираете и собираете тест apk? С задачей ** assembleDebugTest **? – helleye

+0

Да, извините, забыли самую важную часть, вот как вы ее используете! Действительно, assemblyeDebugTest скомпилирует тест apk, но вам, вероятно, понадобятся следующие задачи: «gradlew test» для запуска только модульных тестов и «gradlew connectedAndroidTest» для запуска контрольных тестов. Теоретически «gradlew check» должен запускать все из них, но я думаю, что зависимость задачи еще не установлена. Я добавлю его позже. –

+0

На самом деле извините, 'gradlew check' не должен запускать контрольно-измерительные тесты, а только контрольные единицы и линта. Так что все в порядке. –