2013-11-10 2 views
26

Я использую модульные тесты Android Джейка плагин для Gradle: https://github.com/JakeWharton/gradle-android-test-pluginКак запустить модульные тесты с Android Studio

Моего build.gradle выглядит следующим образом:

dependencies { 
// analytics 
compile('com.crittercism:crittercism-android:3.0.11') 

// retrofit 
compile('com.squareup.retrofit:retrofit:1.2.2') 
compile('com.squareup.okhttp:okhttp:1.2.1') 

// dagger 
compile('com.squareup.dagger:dagger:1.1.0') 
compile('com.squareup.dagger:dagger-compiler:1.1.0') 

// compatibility 
compile('android.compatibility:android-support:v4-r13') 
compile('com.actionbarsherlock:actionbarsherlock:[email protected]') 

// Picasso 
compile('com.squareup.picasso:picasso:2.1.1') 

// Otto 
compile('com.squareup:otto:1.3.4') 

// Tests 
testCompile 'junit:junit:4.10' 
testCompile 'org.robolectric:robolectric:2.2' 
testCompile 'org.powermock:powermock-api-mockito:1.5.1' 
testCompile 'org.easytesting:fest-assert-core:2.0M10' 
} 

К сожалению, я не в состоянии запускать все или отдельную модульную тестовую форму Android Studio. Я получаю сообщение об ошибке:

Exception in thread "main" java.lang.NoClassDefFoundError: junit/textui/ResultPrinter 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:171) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:113) 
Caused by: java.lang.ClassNotFoundException: junit.textui.ResultPrinter 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
... 3 more 

И это правильно, потому что запуск командной строки не включает в свой JUnit зависимость:

/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -ea -Didea.launcher.port=7533 "-Didea.launcher.bin.path=/Applications/Android Studio.app/bin" -Dfile.encoding=UTF-8 -classpath "/Applications/Android Studio.app/lib/idea_rt.jar:/Applications/Android Studio.app/plugins/junit/lib/junit-rt.jar:/Users/eugen/Development/SDK/android-sdk-macosx/platforms/android-18/android.jar:/Users/eugen/Development/SDK/android-sdk-macosx/platforms/android-18/data/res:/Users/eugen/Development/SDK/android-sdk-macosx/tools/support/annotations.jar:/Users/eugen/Development/Projects/eBuddy/xms/android/xms3-android/build/classes/alpha/debug:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.retrofit/retrofit/1.2.2/jar/cdf7b60568092fbcc7a254371c345e92f733c03c/retrofit-1.2.2.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.google.code.gson/gson/2.2.4/jar/a60a5e993c98c864010053cb901b7eab25306568/gson-2.2.4.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.okhttp/okhttp/1.2.1/jar/c3562574496bb4d452d6fc45b817577e98d08afe/okhttp-1.2.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup/javawriter/2.1.1/jar/67ff45d9ae02e583d0f9b3432a5ebbe05c30c966/javawriter-2.1.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.dagger/dagger/1.1.0/jar/49f2061c938987c8e56679a731d74fd8448d8742/dagger-1.1.0.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.picasso/picasso/2.1.1/jar/ab19bfb23f641f189b6dca9a4d393f8dc291103a/picasso-2.1.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup/otto/1.3.4/jar/4d72fb811c7b3c0e7f412112020d4430f044e510/otto-1.3.4.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.dagger/dagger-compiler/1.1.0/jar/ddb38c2be31deeb7a001177f7c358665e350d646/dagger-compiler-1.1.0.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/javax.inject/javax.inject/1/jar/6975da39a7040257bd51d21a231b76c915872d38/javax.inject-1.jar:/Users/eugen/Development/Projects/eBuddy/xms/android/xms3-android/build/exploded-bundles/ComActionbarsherlockActionbarsherlock440.aar/res:/Users/eugen/Development/Projects/eBuddy/xms/android/xms3-android/build/exploded-bundles/ComActionbarsherlockActionbarsherlock440.aar/classes.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.okhttp/okhttp-protocols/1.2.1/jar/ec2beaefef3bd4f680c17fad8e72e66f2a006f1/okhttp-protocols-1.2.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.crittercism/crittercism-android/3.0.11/jar/e30c21ae491d780622ecaee2752969be98140c3/crittercism-android-3.0.11.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/android.compatibility/android-support/v4-r13/jar/bd6479f5dd592790607e0504e66e0f31c2b4d308/android-support-v4-r13.jar" com.intellij.rt.execution.application.AppMain com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 @/private/var/folders/wq/knhztnf105v2_p1t580tj8h80000gp/T/idea_junit701450667388095664.tmp @[email protected]/private/var/folders/wq/knhztnf105v2_p1t580tj8h80000gp/T/idea_working_dirs_junit4927192380605663413.tmp -socket63849 

Интересно, если кто-нибудь смог запустить юнит-тестов в Android Studio? И если возможно, как это сделать?

+0

проверить мой ответ в http://stackoverflow.com/a/20329044/561323 – Grim

+0

Если вы все еще ищете, попробуйте этот пост http://www.element84.com/easy-testing-with-android-studio.html – Matt

+1

благодарим вас за обмен, но я ищу способ запуска тестов внутри студии. Особенно мне нужна возможность запускать один конкретный тест во время сеанса TDD. –

ответ

10

Обновление для AS 1.1+, андроид Gradle плагин 1.1+

Наконец, можно без многих трюков. Вот пример проекта, который показывает, как настроить Robolectric тест в Android Studio v1.1+ и android gradle plugin v1.1+: https://github.com/nenick/AndroidStudioAndRobolectric

Вы можете найти также есть возможные проблемы и обходные пути. Да, Robolectric является сложным и официально не поддерживается Google, поэтому у него все еще есть некоторые проблемы. Но большую часть времени он работает и приносит огромное значение вашему проекту.

Я также хотел бы предложить вам начать использовать Robolectric v3+. Он почти выпущен и достаточно стабилен.

Старый ответ на AS 0.x и 1.0x и андроид Gradle плагином ниже 1.1

мне удалось сделать это с помощью друзей.

Поэтому в основном вам нужно сделать следующие изменения для запуска модульных тестов Robolectric в Android Studio:

  1. Скопируйте путь к классам для теста (вы можете найти его в качестве первой строки в журнале «Run»)
  2. Open конфигурация запуска для блока испытаний
  3. Изменить рабочий реж в папку, где AndroidManifest.xml присутствует
  4. Добавить VM Option -classpath "<path_to_project_folder>/build/test-classes:<path_to_gradle_cache>/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar:<your old classpath>"

Что касается меня начало нового пути к классам выглядит следующим образом:

/Users/emartynov/Development/Projects/work/android.project/build/test-classes:/Users/emartynov/.gradle/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar 

Проблема:

  1. Вы можете запустить тест только для отладки варианта
  2. Каждой новая конфигурация тестового запуска требует таких изменений вручную. Но это просто копия/вставка из двух полей редактирования.

У меня есть версия для Android Studio 0.6. Здесь опять-таки часть моего build.gradle файла:

buildscript { 
    repositories { 
    mavenCentral() 
    maven { url 'https://github.com/rockerhieu/mvn-repo/raw/master/' } 
    } 

    dependencies { 
    classpath 'com.android.tools.build:gradle:0.11.+' 
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.3' 
    // classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.10.1' 
    classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.10.1-SNAPSHOT' 
    classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.10.+' 
    } 
} 

apply plugin: 'android-sdk-manager' 
apply plugin: 'android' 
apply plugin: 'android-apt' 
apply plugin: 'android-test' 

repositories { 
    mavenCentral() 
} 

android { 
    compileSdkVersion 19 
    buildToolsVersion "19.1.0" 

    packagingOptions { 
    exclude 'META-INF/NOTICE' 
    exclude 'META-INF/NOTICE.txt' 
    exclude 'META-INF/notice.txt' 
    exclude 'META-INF/LICENSE' 
    exclude 'META-INF/LICENSE.txt' 
    exclude 'META-INF/license.txt' 
    exclude 'META-INF/ASL2.0' 
    exclude 'LICENSE.txt' 
    } 

    defaultConfig { 
    minSdkVersion 14 
    targetSdkVersion 19 
    versionCode 1 
    versionName "0.9.0" 
    } 

    compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_7 
    targetCompatibility JavaVersion.VERSION_1_7 
    } 

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

dependencies { 
    // butter knife 
    compile 'com.jakewharton:butterknife:5.0.0' 
    // dagger 
    compile 'com.squareup.dagger:dagger:1.2.1' 

    // apt 
    apt 'com.squareup.dagger:dagger-compiler:1.+' 

    // AS tests 
    androidTestCompile 'junit:junit:4.+' 
    androidTestCompile('org.robolectric:robolectric:2.3') { 
    exclude group: 'commons-logging' 
    exclude group: 'org.apache.httpcomponents' 
    } 
    androidTestCompile 'com.squareup:fest-android:1.+' 
    androidTestCompile 'org.mockito:mockito-all:1.9.+' 
    androidTestCompile 'org.easytesting:fest-assert-core:2.0M10' 
    androidTestCompile('org.skyscreamer:jsonassert:1.2.+') { 
    exclude group: 'org.json' 
    } 

    // tests 
    testCompile 'junit:junit:4.+' 
    testCompile('org.robolectric:robolectric:2.3') { 
    exclude group: 'commons-logging' 
    exclude group: 'org.apache.httpcomponents' 
    } 
    testCompile 'com.squareup:fest-android:1.+' 
    testCompile 'org.mockito:mockito-all:1.9.+' 
    testCompile 'org.easytesting:fest-assert-core:2.0M10' 
    testCompile 'com.squareup.dagger:dagger-compiler:1.+' 
    testCompile('org.skyscreamer:jsonassert:1.2.+') { 
    exclude group: 'org.json' 
    } 
} 
27

просто добавить папку instrumentTest в/ЦСИ он должен иметь/Java внутри как этот

enter image description here

затем расширить класс ActivityTestCase (или любой другой андроид блок-тест-класс), такие как

package com.example.app.test; 

import android.test.ActivityTestCase; 

import junit.framework.Assert; 


public class MainActivityTest extends ActivityTestCase { 


public void testHappy(){ 
    Assert.assertTrue(true); 
} 

} 

правой кнопкой мыши на зеленом каталоге Java и выберите выполнить все тесты и вы должны получить это:

enter image description here

удачи

+0

Тот же ответ снова? –

+0

Я переместил свой ответ здесь (я хотел поставить здесь ответ здесь), это то, что у вас есть делать, чтобы запускать модульные тесты в андроид-студии. По крайней мере, это то, что я понимаю, вы хотите сделать, я понял, что ваш вопрос не так? – zebra

+2

Я просил у Robolectric unit test not instrumental –

2

Я столкнулся с этой проблемой и нашел решение - включить classes.jar из взорванного пучка (.aar) в папке сборки. Я не думаю, что поможет найти ресурсы в зависимостях .aar.

testCompile fileTree(dir: "$project.buildDir/exploded-bundles", include: "**/classes.jar") 

Edit: Поскольку Android Gradle построить инструменты 0.9.0 зависимость изменилась к:

androidTestCompile fileTree(dir: "$project.buildDir/exploded-aar", include: "**/classes.jar") 

Edit 2: Поскольку Android Gradle строят инструменты 0.10.0 изменена на:

androidTestCompile fileTree(dir: "$project.buildDir/../../build/exploded-aar", include: "**/classes.jar") 

Примечание: относительный путь может отличаться в зависимости от структуры вашего проекта.

+0

Извините, но это не помогает запускать тесты модуля Robolectric. –

+0

попробовал это, все еще gettin 'Исключение в потоке" main "java.lang.NoClassDefFoundError: junit/textui/ResultPrinter' - кажется, работает моя система JDK'/Library/Java/JavaVirtualMachines/jdk1.7.0_55.jdk/Содержание/Главная/bin/java' может ли это быть? – AlexChaffee

+0

@AlexChaffee с инструментами построения градиентов 0.10.0 место разнесенных ара изменилось снова (см. Обновленный ответ) - это может быть вашей проблемой. – myanimal

0

У меня была аналогичная проблема с AS 1.2.2.

Я выполнил шаги here. В основном:

  • Открыто окно инструмента «Сборка вариантов» (см. Изображение по ссылке) и выпадающее меню «Испытательный артефакт» в «Единичные тесты».
  • Создайте каталог для вашего исходного кода тестирования, то есть src/test/java, и переместите свой тест на соответствующий пакет.
  • Убедитесь, что следующие разделы файла build.gradle содержат следующие:

    dependencies { 
        testCompile 'junit:junit:4.12' 
    } 
    
    android { 
        sourceSets { 
         test { 
          resources { 
           srcDir "test" 
          } 
         } 
        } 
    } 
    

вуаля! Щелкните правой кнопкой мыши свой тестовый пример и выберите JUnit.

Кстати, похоже, что вы переключаете видимость тестов JUnit/Android при изменении инструмента «Build Variants», поэтому, я думаю, вы можете либо тестировать JUnit, либо Android, но не оба одновременно.

+0

Спасибо за ответ! Вопрос уже не имеет значения :) BTW Android Studio 1.3 stable отсутствует, а 1.4 сейчас в предварительном просмотре (если вы не боитесь) –

0

Для потомков Android Studio 2.0+ поддерживает запуск модульных тестов без плагинов.

JUnit configuration in Android Studio 2.0+

Этот экран может быть доступен через меню Run> Edit Configurations ...

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