Вступ
Зауважте, що на момент написання роботи robolectric 2.4 є останньою версією і не підтримує appcompat v7
бібліотеку. Підтримка буде додана у версії robolectric 3.0 (ще немає часу прибуття ). Також ActionBar Sherlock
може спричинити проблеми з роболектриком.
Щоб використовувати 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
Я зіткнувся з кількома проблемами під час налаштування тестів 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)
Сценарій збірки - це файл build.gradle у кореневій частині проекту. Там мені довелося додати плагін robolectric gradle до шляху до класу
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.13.2'
classpath 'org.robolectric:robolectric-gradle-plugin:0.13.+'
}
}
allprojects {
repositories {
jcenter()
}
}
Проект buildscript (App / build.gradle)
У сценарії збірки вашого модуля програми використовуйте robolectric
плагін, додайте robolectric
конфігурацію та додайте androidTestCompile
залежності.
apply plugin: 'com.android.application'
apply plugin: 'robolectric'
android {
}
robolectric {
include '**/*Test.class'
exclude '**/espresso/**/*.class'
maxHeapSize = '2048m'
jvmArgs '-XX:MaxPermSize=512m', '-XX:-UseSplitVerifier'
ignoreFailures true
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(){
assert true;
}
@Test
public void testThatFails(){
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:
:app:test
BUILD SUCCESSFUL
Вирішення проблем
каталоги альтернативних джерел
Так само, як ви можете мати свої вихідні файли Java кудись ще, ви можете перемістити свої тестові вихідні файли. Просто оновіть sourceSets
конфігурацію gradle .
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.lang.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, вам доведеться трохи більше розгорнути файл build.gradle, щоб андроїд-студія могла знайти ваші складені тестові класи:
sourceSets {
testLocal {
java.srcDir file('src/test/java')
resources.srcDir file('src/test/resources')
}
}
android {
sourceSets {
instrumentTest.setRoot('src/test')
}
}
dependencies {
testLocalCompile 'junit:junit:4.11'
testLocalCompile 'com.google.android:android:4.1.1.4'
testLocalCompile 'org.robolectric:robolectric:2.3'
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/
Ще трохи ресурсів
Найкращі статті, які я знайшов навколо цього:
java.srcDirs = ['src/main/java','src/instrumentTest/java']
уsourceSets
розділіbuild.gradle