Запуск простых тестов JUnit на Android Studio (IntelliJ) при использовании конфигурации на основе Gradle



я использую Android Studio/IntelliJ чтобы построить на существующем и хотел бы добавить некоторые простые JUnit модульные тесты. Какая папка подходит для добавления таких тестов?



андроид Gradle плагин определяет структуру каталогов с src/main/java для основного исходного кода и src/instrumentTest/java на Android тесты.



попытка добавить мои тесты JUnit в instrumentTest не сработала для меня. Я могу запустить его как

681   6  

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 плагин, добавить robolectric config и добавить 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 sourceSets config.

    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

    Ничего не найдено.