Запуск простых тестов JUnit на Android Studio (IntelliJ) при использовании конфигурации на основе Gradle
я использую Android Studio/IntelliJ чтобы построить на существующем и хотел бы добавить некоторые простые JUnit модульные тесты. Какая папка подходит для добавления таких тестов?
андроид Gradle плагин определяет структуру каталогов с src/main/java для основного исходного кода и src/instrumentTest/java на Android тесты.
попытка добавить мои тесты JUnit в instrumentTest не сработала для меня. Я могу запустить его как
6 ответов:
начиная с Android Studio 1.1, ответ теперь прост: http://tools.android.com/tech-docs/unit-testing-support
нормально, ты не можешь. Добро пожаловать в мир Android, где все тесты должны выполняться на устройстве(за исключением Robolectric).
основная причина заключается в том, что у вас на самом деле нет источников фреймворка - даже если вы убедите IDE запустить тест локально, вы сразу же получите "заглушку! Не реализовано" исключение. - Но почему?- может быть, вам интересно? Потому что
android.jarчто SDK дает вам на самом деле все заглушено - все классы и методы есть, но все они просто бросают исключение. Это там, чтобы обеспечить API, но не там, чтобы дать вам какую-либо фактическую реализацию.есть замечательный проект под названием Robolectric который реализует много рамок, чтобы вы могли запускать значимые тесты. В сочетании с хорошей макетной структурой (например, Mockito), это делает вашу работу управляемой.
Gradle плагин:https://github.com/robolectric/robolectric-gradle-plugin
интро
обратите внимание, что на момент написания robolectric 2.4 является последней версией и не имеет поддержки для
appcompat v7библиотека. Поддержка будет добавлена в релиз robolectric 3.0 (пока нет ETA). ТакжеActionBar Sherlockможет вызвать проблемы с robolectric.для использования Robolectric в Android Studio у вас есть 2 варианта:
(Вариант 1) - запуск тестов JUnit с Android Studio с использованием модуля Java
этот метод использует java модуль для всех ваших тестов с зависимостью от вашего модуля android и пользовательского тестового бегуна с некоторой магией:
инструкции можно найти здесь: http://blog.blundellapps.com/how-to-run-robolectric-junit-tests-in-android-studio/
также проверьте ссылку в конце этого сообщения для запуска тестов из android studio.
(Вариант 2) - запуск тестов JUnit с Android Studio с помощью robolectric-gradle-plugin
I столкнулись с несколькими проблемами при настройке тестов junit для запуска из gradle в Android Studio.
это очень простой пример проекта для запуска тестов junit из проекта на основе gradle в Android Studio:https://github.com/hanscappelle/android-studio-junit-robolectric это было протестировано с Android Studio 0.8.14, JUnit 4.10, Robolectric gradle plugin 0.13+ и robolectric 2.3
Buildscript (project/build.gradle)
скрипт сборки построение.файл gradle в корне вашего проекта. Там я должен был добавить Robolectric gradle plugin в classpath
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:0.13.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files classpath 'org.robolectric:robolectric-gradle-plugin:0.13.+' } } allprojects { repositories { jcenter() } }Project buildscript (App/build.gradle)
в скрипте сборки вашего модуля приложения используйте
robolectricплагин, добавитьrobolectricconfig и добавитьandroidTestCompileзависимостей.apply plugin: 'com.android.application' apply plugin: 'robolectric' android { // like any other project } robolectric { // configure the set of classes for JUnit tests include '**/*Test.class' exclude '**/espresso/**/*.class' // configure max heap size of the test JVM maxHeapSize = '2048m' // configure the test JVM arguments jvmArgs '-XX:MaxPermSize=512m', '-XX:-UseSplitVerifier' // configure whether failing tests should fail the build ignoreFailures true // use afterTest to listen to the test execution results afterTest { descriptor, result -> println "Executing test for {$descriptor.name} with result: ${result.resultType}" } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile 'org.robolectric:robolectric:2.3' androidTestCompile 'junit:junit:4.10' }Создать Тестовые Классы JUnit
Теперь поместите тестовые классы в расположение по умолчанию (или обновите конфигурацию gradle)
app/src/androidTest/javaи назовите свои классы тестов, заканчивающиеся тестом (или снова обновите конфигурацию), расширяя
junit.framework.TestCaseи аннотировать методы испытаний с@Test.package be.hcpl.android.mytestedapplication; import junit.framework.TestCase; import org.junit.Test; public class MainActivityTest extends TestCase { @Test public void testThatSucceeds(){ // all OK assert true; } @Test public void testThatFails(){ // all NOK assert false; } }Выполнить Тесты
далее выполнить тесты с помощью gradlew из командной строки (сделать его исполняемым с помощью
chmod +xпри необходимости)./gradlew clean testпример вывода:
Executing test for {testThatSucceeds} with result: SUCCESS Executing test for {testThatFails} with result: FAILURE android.hcpl.be.mytestedapplication.MainActivityTest > testThatFails FAILED java.lang.AssertionError at MainActivityTest.java:21 2 tests completed, 1 failed There were failing tests. See the report at: file:///Users/hcpl/Development/git/MyTestedApplication/app/build/test-report/debug/index.html :app:test BUILD SUCCESSFULустранение неисправностей
каталоги альтернативных источников
так же, как и вы может иметь исходные файлы java где-то еще вы можете переместить исходные файлы теста. Просто обновите gradle
sourceSetsconfig.sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } androidTest { setRoot('tests') } }пакета org.junit не существует
вы забыли добавить зависимость теста junit в скрипт сборки приложения
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile 'org.robolectric:robolectric:2.3' androidTestCompile 'junit:junit:4.10' }java.ленг.RuntimeException: Заглушка!
вы запускаете этот тест с конфигурациями запуска из Android Studio вместо командной строки (вкладка "терминал" В Android Studio). Чтобы запустить его из Android Studio вам придется обновить
app.imlфайл, чтобы запись jdk была указана внизу. Смотрите deckard-gradle пример для сведения.выполнить ошибки, например:
!!! JUnit version 3.8 or later expected: java.lang.RuntimeException: Stub! at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5) at junit.textui.TestRunner.<init>(TestRunner.java:54) at junit.textui.TestRunner.<init>(TestRunner.java:48) at junit.textui.TestRunner.<init>(TestRunner.java:41) at com.intellij.rt.execution.junit.JUnitStarter.junitVersionChecks(JUnitStarter.java:190) at com.intellij.rt.execution.junit.JUnitStarter.canWorkWithJUnitVersion(JUnitStarter.java:173) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:56) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)ошибка: JAVA_HOME установлен в недопустимый каталог
посмотреть это так вопрос для решения. Добавьте ниже экспорт в ваш профиль bash:
export JAVA_HOME=`/usr/libexec/java_home -v 1.7`полный журнал ошибок:
ERROR: JAVA_HOME is set to an invalid directory: export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home Please set the JAVA_HOME variable in your environment to match the location of your Java installation.тестовый класс не нашел
если вы хотите запустить свои тесты из Android Studio Junit Test runner вместо этого вам придется расширить сборку.gradle файл немного больше, так что android studio может найти ваши скомпилированные тестовые классы:
sourceSets { testLocal { java.srcDir file('src/test/java') resources.srcDir file('src/test/resources') } } android { // tell Android studio that the instrumentTest source set is located in the unit test source set sourceSets { instrumentTest.setRoot('src/test') } } dependencies { // Dependencies for the `testLocal` task, make sure to list all your global dependencies here as well testLocalCompile 'junit:junit:4.11' testLocalCompile 'com.google.android:android:4.1.1.4' testLocalCompile 'org.robolectric:robolectric:2.3' // Android Studio doesn't recognize the `testLocal` task, so we define the same dependencies as above for instrumentTest // which is Android Studio's test task androidTestCompile 'junit:junit:4.11' androidTestCompile 'com.google.android:android:4.1.1.4' androidTestCompile 'org.robolectric:robolectric:2.3' } task localTest(type: Test, dependsOn: assemble) { testClassesDir = sourceSets.testLocal.output.classesDir android.sourceSets.main.java.srcDirs.each { dir -> def buildDir = dir.getAbsolutePath().split('/') buildDir = (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/') sourceSets.testLocal.compileClasspath += files(buildDir) sourceSets.testLocal.runtimeClasspath += files(buildDir) } classpath = sourceSets.testLocal.runtimeClasspath } check.dependsOn localTestот:http://kostyay.name/android-studio-robolectric-gradle-getting-work/
больше ресурсов
лучшие статьи, которые я нашел вокруг этого являются:
Это теперь поддерживается в Android Studio, начиная с Android Gradle plugin 1.1.0, проверьте это:
https://developer.android.com/training/testing/unit-testing/local-unit-tests.html
пример приложения с локальными модульными тестами на GitHub:
https://github.com/googlesamples/android-testing/tree/master/unittesting/BasicSample
на Android Studio 1.2+ настройки проекта для JUnit довольно просто попробуйте следовать вдоль этого урока:
Это самая простая часть настройки проекта для JUnit:
https://io2015codelabs.appspot.com/codelabs/android-studio-testing#1
следуйте по последней ссылке до "запуск тестов"
теперь, если вы хотите интегрировать с intrumentation test следуйте вот:
https://io2015codelabs.appspot.com/codelabs/android-studio-testing#6
смотрите учебник С официального сайта разработчиков Android. В этой статье также показано, как создавать макеты для испытаний.
кстати, следует отметить, что область действия зависимостей для простого теста JUnit должна быть "testCompile".
Comments