Gradle 기반 구성을 사용할 때 Android Studio (IntelliJ)에서 간단한 JUnit 테스트 실행


78

Android Studio/IntelliJ기존 Android프로젝트 에서 빌드하는 데 사용 하고 있으며 간단한 JUnit단위 테스트 를 추가하고 싶습니다 . 이러한 테스트를 추가 할 올바른 폴더는 무엇입니까?

안드로이드 Gradle와 플러그인을 정의 디렉토리 구조 src/main/java의 주요 소스 코드와 src/instrumentTest/java에 대한 Android테스트합니다.

instrumentTest에 내 JUnit 테스트를 추가하려고해도 효과가 없었습니다. 나는 그것을 Android테스트 로 실행할 수 있지만 (그 디렉토리가 보이는 것입니다) 내가 찾고있는 것이 아닙니다 JUnit. 단순한 테스트 를 실행하고 싶습니다 . 이 클래스에 대한 JUnit 실행 구성을 만들려고 시도했지만 작동하지 않았습니다 Android. Source 대신 Test 로 플래그가 지정된 디렉토리를 사용하고 있기 때문 입니다.

새 소스 폴더를 만들고 프로젝트 구조에 표시하면 다음 IntelliJ에 gradle 빌드 파일에서 프로젝트 구성을 새로 고칠 때 지워 집니다.

gradle 기반 Android 프로젝트에서 JUnit 테스트를 구성하는 더 적절한 방법은 무엇입니까 IntelliJ? 이를 위해 사용할 디렉토리 구조는 무엇입니까?


불행하게도 나는 아직도이와 함께 자신을 사투를 벌인거야으로 나는 테스트와 함께 당신을 도울 수 있지만 소스 폴더를 닦아 인 IntelliJ를 중지하려면이 옵션을 사용할 수 있습니다 java.srcDirs = ['src/main/java','src/instrumentTest/java']에서 sourceSets의 섹션build.gradle
롭 홈즈

설정하는 것이 재미없고 유지 관리도 간단하지 않지만 어떻게 든 /src/androidTest/javarobolectric JUnit 테스트가 있는 기본 폴더를 사용하여 실행했습니다 . 참조 : stackoverflow.com/a/25473702/1406325
Flo

Android 스튜디오는 이제 JUnit 4로 로컬 단위 테스트를 지원합니다. stackoverflow.com/a/30273301/885464
Lorenzo Polidori

@Julian Cerruti 업데이트 : 테스트 케이스 goo.gl/ac06C0 실행 방법 및 네트워크 호출 테스트 실행 예제 goo.gl/bQFlmU
nitesh 2015-07-30

테스트 및 테스트 된 클래스의 디렉토리 구조가 적합해야합니다. 여기 쉽게하는 방법입니다 : stackoverflow.com/a/36057080/715269
Gangnus

답변:


23

Android Studio 1.1에서 답은 이제 간단합니다. http://tools.android.com/tech-docs/unit-testing-support


4
이것은 Robolectric이 더 이상 유용하지 않다는 것을 의미합니까? 이것이 본질적으로 같은 일을할까요?
David Argyle Thacker

1
참고 : Android Studio 2.0 Beta5부터는 링크에서 "Test Artifact"선택기가 누락되었으며 두 모드 (junit 및 insttrumentation)가 기본적으로 동시에 활성화됩니다. 더 많은 정보 여기를 참조하십시오 stackoverflow.com/questions/35708263/...
패트릭 파브르에게

36

일반적으로 할 수 없습니다. 모든 테스트가 기기 (Roboolectric 제외)에서 실행되어야하는 Android의 세계에 오신 것을 환영합니다.

주된 이유는 실제로 프레임 워크의 소스가 없기 때문입니다. IDE가 테스트를 로컬에서 실행하도록 설득하더라도 즉시 "Stub! Not Implemented"예외가 발생합니다. "왜?" 궁금할까요? android.jarSDK가 제공하는 것은 실제로 모두 스텁 처리되어 있기 때문에 모든 클래스와 메서드가 있지만 모두 예외가 발생합니다. API를 제공하기위한 것이지만 실제 구현을 제공하기위한 것이 아닙니다.

의미있는 테스트를 실행할 수 있도록 많은 프레임 워크를 구현하는 Robolectric 이라는 멋진 프로젝트가 있습니다. 좋은 모의 프레임 워크 (예 : Mockito)와 함께 사용하면 작업을 관리 할 수 ​​있습니다.

Gradle 플러그인 : https://github.com/robolectric/robolectric-gradle-plugin


1
고마워요, Deylan. 저는 Android 인프라를 사용하지 않는 간단한 테스트를 수행하고 있으므로 제안한대로 새 프로젝트를 만들거나 정기적 인 테스트를 수용하기 위해 Gradle Android 구성을 조정하는 것이 갈 길입니다. 이 저런 이유로 실패 유지 - -하지만 내가 일에 그것을 얻을 경우 그 결과를 게시 할 예정입니다 불행하게도 나는 아직도 일에 얻을 수 없습니다
줄리안 세루 띠를

1
이 경우 새 일반 Java Gradle 프로젝트 (예 :)를 만들고 apply plugin: 'java''settings.gradle'에 추가하고 Android 프로젝트 ( compile project(':plainJavaProjectName'))에 대한 종속성으로 설정 하고 test작업을 실행하고 싶습니다. (테스트되지 않았지만 확실히 작동합니다!)
Delyan 2013-07-25

3
일반 Java gradle 프로젝트의 테스트는 명령 줄에서 잘 작동하지만 "class not found MyTestClass"오류가 발생하는 Android Studio 내부에서는 작동하지 않습니다. AS와 명령 줄이 같은 방식으로 gradle을 사용해야하기 때문에 이상합니다.
lukas

1
JUnit 테스트를 사용하려면 gradle을 피하십시오. maven이 더 나은 옵션입니다.
Jeroen 2014 년

3
그 진술을 정당화 할 수 있습니까? Maven이 더 나은 이유는 무엇입니까?
RichieHH 2014 년

32

소개

현재 robolectric 2.4는 최신 버전이며 appcompat v7라이브러리를 지원하지 않습니다 . robolectric 3.0 릴리스에 지원이 추가 될 예정입니다 ( 아직 ETA 없음 ). 또한 ActionBar Sherlockrobolectric에 문제를 일으킬 수 있습니다.

Android Studio에서 Robolectric을 사용하려면 두 가지 옵션이 있습니다.

(옵션 1)-Java 모듈을 사용하여 Android Studio에서 JUnit 테스트 실행

이 기술은 Android 모듈에 대한 종속성이있는 모든 테스트에 Java 모듈을 사용하고 몇 가지 마법이있는 사용자 지정 테스트 실행기를 사용합니다.

지침은 다음에서 찾을 수 있습니다. http://blog.blundellapps.com/how-to-run-robolectric-junit-tests-in-android-studio/

또한 Android 스튜디오에서 테스트를 실행하려면 해당 게시물 끝에있는 링크를 확인하십시오.

(옵션 2)-robolectric-gradle-plugin을 사용하여 Android Studio에서 JUnit 테스트 실행

Android Studio의 gradle에서 실행할 junit 테스트를 설정하는 데 몇 가지 문제가 발생했습니다.

이것은 Android Studio의 gradle 기반 프로젝트에서 junit 테스트를 실행하기위한 매우 기본적인 샘플 프로젝트입니다. https://github.com/hanscappelle/android-studio-junit-robolectric Android Studio 0.8.14, JUnit 4.10에서 테스트되었습니다. robolectric gradle 플러그인 0.13+ 및 robolectric 2.3

빌드 스크립트 (project / build.gradle)

빌드 스크립트는 프로젝트 루트에있는 build.gradle 파일입니다. 거기에 robolectric gradle 플러그인 을 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()
    }
}

프로젝트 빌드 스크립트 (App / build.gradle)

앱 모듈의 빌드 스크립트에서 robolectric플러그인을 사용하고 robolectric구성을 추가하고 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구성을 업데이트하십시오 .

    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 스튜디오의 터미널 탭) 대신 Android 스튜디오에서 실행 구성으로이 테스트를 실행하고 있습니다. 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이 잘못된 디렉토리로 설정되었습니다.

해결책 은 이 SO 질문 을 참조하십시오 . 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에서 테스트를 실행하려면 Android 스튜디오가 컴파일 된 테스트 클래스를 찾을 수 있도록 build.gradle 파일을 조금 더 확장해야합니다.

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/

더 많은 리소스

내가 찾은 최고의 기사는 다음과 같습니다.



1

들어 안드로이드 스튜디오 1.2+ 위한 프로젝트 설정 의 JUnit을 아주 간단의 인 이 자습서를 따라하는 시도는 :

다음은 JUnit 용 프로젝트를 설정하는 가장 간단한 부분입니다.

https://io2015codelabs.appspot.com/codelabs/android-studio-testing#1

"때까지 과거의 링크를 함께 따라 테스트를 실행 "

이제 intrumentation 테스트와 통합하려면 여기에서 따르십시오.

https://io2015codelabs.appspot.com/codelabs/android-studio-testing#6


0

Android 개발자 공식 사이트 에서이 튜토리얼 을 참조하십시오 . 이 문서에서는 테스트를위한 모형을 만드는 방법도 보여줍니다.

참고로 간단한 JUnit 테스트의 종속성 범위는 "testCompile"이어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.