Android 테스트 실행기가 '빈 테스트 도구 모음'을보고하는 이유는 무엇입니까?


98

IntelliJ / Android가 "Empty test suite"를보고하는 이유를 알아 내려고 여기 벽에 머리를 부딪 히고 있습니다. 두 개의 IntelliJ 모듈 (Eclipse의 "Projects")이있는 작은 프로젝트가 있습니다. 단위 테스트 모듈에는 맨 아래에 붙여 넣은 자체 AndroidManifest.xml이 있습니다. ActivityUnitTestCase테스트가 Context-object에 의존하기 때문에을 실행하려고합니다 .

기본 모듈의 패키지 이름은입니다 nilzor.myapp. 테스트 모듈의 pacakge 이름은 다음과 같습니다.nilzor.myapp.tests

테스트 실행기가 testBlah()-method를 테스트로 감지하지 않는 이유는 무엇 입니까?

<?xml version="1.0" encoding="utf-8"?>
<!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="nilzor.myapp.tests"
          android:versionCode="1"
          android:versionName="1.0">
    <!-- We add an application tag here just so that we can indicate that
         this package needs to link against the android.test library,
         which is needed when building test cases. -->
    <application>
        <uses-library android:name="android.test.runner"/>
    </application>
    <!--
    This declares that this application uses the instrumentation test runner targeting
    the package of nilzor.myapp.  To run the tests use the command:
    "adb shell am instrument -w nilzor.myapp.tests/android.test.InstrumentationTestRunner"
    -->
    <instrumentation android:name="android.test.InstrumentationTestRunner"
                     android:targetPackage="nilzor.myapp"
                     android:label="Tests for nilzor.myapp"/>
</manifest>

그리고 여기 내 테스트 수업이 있습니다 :;

package nilzor.myapp.tests;

public class NilzorSomeTest<T extends Activity> extends ActivityUnitTestCase<T>{
    public NilzorSomeTest(Class<T> activityClass){
        super(activityClass);
    }

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}

이클립스 용 임에도 불구 하고 테스트 기본 사항 , 활동 테스트 문서를 읽고이 Hello world 테스트 블로그를 따라가 보았습니다 . 테스트 러너가 내 테스트를 찾아 실행할 수 없습니다. 내가 뭘 잘못하고 있죠?

여전히 확신 할 수없는 몇 가지 질문은 다음과 같습니다.

  1. 단위 테스트 방법 위에 주석이 필요합니까?
  2. 메소드 앞에 "test"를 붙여야합니까, 아니면 JUnit 테스트 전용입니까?
  3. 의 하위 패키지에서 테스트를 할 수 있습니까 nilzor.myapp.tests?

그러나이 게시물의 주요 질문은 테스트 러너가 내 테스트를 감지하지 못하는 이유입니다 .


포인트 3의 경우 Android Studio cmd+shift+t를 사용하는 경우 현재 편집중인 클래스와 일치하는 올바른 패키지 위치에 테스트 클래스를 자동으로 생성하는 바로 가기를 권장합니다 .
David Argyle Thacker

다른 사람이 나만큼 채굴되지 않을 경우를 대비해. @Test테스트 상단에 마커 를 놓는 것을 잊지 않았는지 확인하십시오 .
Matt D

답변:


70

테스트 클래스에 대한 기본 생성자를 제공해야합니다. 예를 들면 다음과 같습니다.

package nilzor.myapp.tests;

public class NilzorSomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
    public NilzorSomeTest(){
        super(ActivityYouWantToTest.class);
    }

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}

다른 질문에 대해 :

  1. 아니요. 내 테스트는 여전히 주석없이 실행되지만이를 사용하는 것이 좋은 습관이라고 생각합니다. 실행할 테스트의 크기를 지정할 수 있습니다. Android에서 @SmallTest, @MediumTest 및 @LargeTest 주석의 목적은 무엇인가요?를 참조하세요 . 자세한 내용은.

  2. 예, "test"접두사가 필요합니다. InteliJ는 "test"접두사가 없을 때 "method never used"경고를 표시하고 테스트 실행 중에 해당 메서드를 건너 뜁니다.

  3. 예. 내 테스트를 하위 패키지로 구성했는데 잘 작동하는 것 같습니다.


5
ActivityTestRule
Yair Kukielka

기본 생성자를 추가하면 나를 위해 일했습니다.
Dragan Marjanović 2018

54

이 문제가 "갑자기"또는 "5 분 전에 작동했습니다"가 발생하는 경우 내 솔루션은 실행 / 디버그 구성으로 이동하여 "Android 테스트"에서 구성을 제거하는 것입니다. 테스트중인 클래스를 리팩터링하면 (예 : 새 패키지로 이동) 이러한 구성이 손상되는 경우가 있습니다.

여기에 이미지 설명 입력


이것은 나를 위해 일했습니다. 빈 테스트 스위트 오류가 발생했습니다. 구성이 처음 생성 된 후 PowerMockito를 추가했기 때문일 수 있습니다.
Ajith Memana

빌드 구성이 이전에 제대로 작동했던 테스트를 실행하는 동안이 문제와 기타 문제가 자주 발생합니다. 이 접근 방식을 사용하여 문제를 해결할 수있었습니다.
stevehs17 2016

3
구성을 삭제 한 후 프로젝트 탐색기 (Android보기)에서 테스트 패키지를 마우스 오른쪽 버튼으로 클릭하고 선택 Create 'Tests in XXX...-다시 작동합니다.
TmTron

9

위의 어느 것도 나를 위해 그것을 수정하지 않았습니다. 도움이 된 것은 지침따르는 것이 었습니다 .

테스트 구성 만들기

Android Studio에서 :

  • 실행 메뉴 열기 -> 구성 편집
  • Android 테스트 구성 추가
  • 모듈 선택
  • 특정 계측 실행기를 추가합니다.

  android.support.test.runner.AndroidJUnitRunner

새로 생성 된 구성을 실행합니다.


6

비슷한 문제가있었습니다. 왜 이런 일이 발생하는지 확실하지 않지만 Android Studio에서 "File"> "Invalidate Caches / Restart"로 이동하여 문제를 해결할 수있었습니다.


내 테스트 클래스의 이름을 리팩토링 한 후 OP와 동일한 오류가 발생했을 때이 문제가 해결되었습니다.
Marco

4

Android Studio에 도움이되는지 모르겠지만 Intellij-Gradle 충돌이 발생했습니다. 테스트 파일을 "마우스 오른쪽 버튼으로 클릭"하고 "파일 컴파일 ... Test.java"를 눌러 문제를 해결했습니다. 그 후 단일 테스트를 다시 실행할 수 있습니다.


2
* Test.java에서이 "컴파일 파일"은 어디에 있습니까? Android Studio의 버전은 무엇입니까?
Mark Lapasa

위에서 말했듯이 Android Studio를 사용하지 않습니다. Intellij 15 proffesional을 사용하고 있습니다. 오른쪽 클릭 드롭 다운 이미지 <-여기에 이미지를 붙여 넣었습니다.
kotlinski

4

Android Studio 2.3.1에서 동일한 문제가 발생했는데 AS의 버그였습니다. 버전 2.2.1에서 동일한 테스트를 실행하면 정상적으로 수행됩니다.

Cannary 채널에서만 Android Studio를 실행하는 경우 안정적인 버전도 설치하는 것이 좋습니다. http://tools.android.com/tips/using-multiple-android-studio-versions


나에게도 똑같이 안정적인 3.1.2는 작동하지만 3.2 canary 15는 그렇지 않습니다.
arekolek

3

나는 gradle안드로이드 스튜디오가 업그레이드 될 때까지 잘 실행되는 테스트를 받았습니다.

테스트에 기본 생성자를 추가하는 것 외에도 테스트 스위트가 작동하도록하려면 이러한 작업 중 일부를 수행해야 할 수 있습니다.

아래에서 src/생성 androidTest/java/<your-package-name>/test. 를 참고 androidTest. 을 포함한 다른 instrumentTest것은 작동하지 않습니다.

이것을 추가하십시오 build.gradle

sourceSets {
    testLocal {
        java.srcDir file('src/androidTest/java')
        resources.srcDir file('src/androidTest/resources')
    }
}



android{
    sourceSets {
       instrumentTest.setRoot('src/androidTest/')
    }
}

dependencies{
     testLocalCompile 'junit:junit:4.11'
}

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

이것을 추가하십시오 AndroidManifest.xml

 <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:label="Tests for my packaged app"
        android:targetPackage="<my-package-name>.test" />

3

Intellij 15의 경우 다음과 같이이 문제를 해결했습니다.

  1. '프로젝트 구조'설정 열기
  2. '모듈'클릭 (왼쪽)
  3. '소스'탭
    a. 소스 디렉토리 (보통 src)를 마우스 오른쪽 버튼으로 클릭하고 '소스'를 클릭합니다.
    비. 테스트 디렉토리를 마우스 오른쪽 버튼으로 클릭하고 'Test'를 클릭
    합니다. c. 외부 디렉토리를 마우스 오른쪽 버튼으로 클릭하고 '제외됨'을 클릭하십시오.
  4. '경로'탭
    으로 이동 합니다. '모듈 컴파일 출력 경로 사용'라디오 버튼을 클릭합니다
    . b. '출력 경로'에 대한 출력 경로 디렉토리를 선택하십시오
    . c. '테스트 출력 경로'에 대한 테스트 경로 디렉토리를 선택하십시오.
  5. 확인을 클릭하십시오.

3

분명히 계측 테스트이므로 테스트를 실행하려면 대상 장치 가 필요합니다 . 어떤 이유로 Android 스튜디오는 때때로이 대상 장치를 가리 키도록 요청하지 않고 "Empty Test Suite"메시지 만 표시합니다. 이 문제를 해결하는 방법에는 여러 가지가 있습니다. 다음은 몇 가지입니다.

  • 기본 앱을 실행하고 대상 장치를 선택하거나

  • 실행 (실행 / 실행 ... / 구성 편집) 구성으로 이동하여 배포 대상 옵션을 수정합니다.


그들이 당신의 해결책을 시도한다면 누군가를 돕기 위해. 제 경우에는 먼저 기기 / 에뮬레이터에서 실제 앱을 실행해야했고 그 후 AndroidTest는 테스트를 실행할 기기를 볼 수있었습니다. 그 후 모든 것이 작동했습니다. 답을 위해 플러스 원을줍니다.
A_P 2017

2

제 경우에는 이전 답변 중 어느 것도 작동하지 않았습니다. 해결책은 단순히 테스트 클래스를 다른 패키지로 옮기는 것 입니다.

이것은 아래에서 일어났다 androidTest/


2

내 경우에는 문제가 내 코드의 실수로 인해 발생했으며 실제로는 응용 프로그램 클래스에 있었으므로 대상 활동이 열리지 않았고 테스트 출력이 인쇄됩니다.

빈 테스트 스위트 오류

터미널에서 직접 테스트를 실행 해 보았습니다 adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner. 이것으로 예외에 대해 훨씬 더 많은 것을 인쇄합니다.


2

내 build.gradle에이 문제가 있었기 때문에이 문제가 발생했습니다.

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

Android Test Orchestrator를 사용하지 않았지만 (실수로 튜토리얼에서 복사 한 것임).

그것을 주석으로 처리하면 해결되었습니다.


1

다른 솔루션 중 어느 것도 저에게 효과가 없었지만 기존 앱 또는 테스트 스위트를 제거한 다음 테스트를 실행하여 간단히 작동시킬 수있었습니다.


그것은 나를 도왔다. 테스트를 실행하기 전에 데이터베이스 수준에서 변경했기 때문에 계측 테스트의 클래스가 작동하지 않았습니다. Android Studio가 이러한 관련없는 메시지를 표시하는 것은 이상합니다.
PetroCliff

1

제 경우에는 제가 작업하던 프로젝트에 두 개의 모듈이있었습니다. 이 오류에 대해 찾은 솔루션 중 어느 것도 도움이되지 않았고 어떻게 든 build.gradle 파일 모두에 테스트 종속성을 추가하면 테스트가 마술처럼 작동하기 시작했다는 것을 깨달았습니다. 테스트가 모듈 중 하나에 만 존재하는지 여부는 중요하지 않습니다. 두 gradle 파일 모두 종속성과 testInstrumentationRunner 값을 포함해야합니다.

따라서 나처럼 다른 답변이 도움이되지 않았다면 각 모듈의 build.gradle 파일에 다음 줄을 추가하십시오.

android {    
    ....
    defaultConfig {
        ...
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }  
}

다음을 추가하십시오.

dependencies {
    ...
    // Test
    androidTestCompile 'com.android.support:support-annotations:23.4.0'
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test:rules:0.5'

}

1

방금 파일 이름을 바꾸고 문제가 해결되었습니다.


1

나는 같은 문제가 있었고 그 이유는 내 테스트 클래스가 클래스 이름 끝에 Test가 없었기 때문입니다!


1

내 문제는 예외가 발생하여 발생했습니다. @BeforeClass 내 테스트 케이스 메서드 . 테스트가 실패하지 않는 이유는 logcat 출력을 검사해야만 찾았습니다.

예외를 수정하고 갑자기 테스트가 실행되었습니다!


저도 마찬가지입니다. BeforeClass에서 그 예외가 제대로 실행 패널에 표시되지 않는 것 같다
데이비드 Refaeli를


0

이 기사가 도움이되었습니다 : 빈 테스트 스위트

기본적으로 src 디렉터리 아래에 instrumentTest / java 패키지를 만들고 모든 테스트를 거기에 넣어야했습니다. 그런 다음이 테스트를 개별적으로 실행할 수 있습니다.


0

이것이 발생하는 원시 Java 프로젝트가 있습니다. 간단히 Java + JUnit4. .idea / 또는 .iml 파일에 확실히 존재합니다. 나는 내 것을 폐기하고 다시 가져 왔고 마침내 테스트가 다시 실행되었습니다.


0

테스트 클래스는 컴파일에서 제외 될 수 있습니다. 설정 컴파일러 제외에서 수정하십시오.


0

Android Studio가 갑자기 테스트 실행 / 디버깅을 중지하기로 결정했을 때 수행하는 디버깅 단계는 다음과 같습니다 (그리고 이런 일이 자주 발생합니다 !!).

  • 빌드 : → 프로젝트 다시 빌드
  • 장치 다시 시작 : 장치 / 에뮬레이터를 다시 시작하고 다시 시도하십시오.
  • 장치 스위치 : 일반 전화와 에뮬레이터가 모두있는 경우 하나를 분리하고 장치 중 하나로 실행 해보십시오.
  • Android Studio : 파일-> 캐시 무효화 및 다시 시작
  • 활동 모니터 / 작업 관리자 : 이름별로 프로세스를 정렬하고, 많은 램을 사용하는 이름없는 프로세스가 있는지 확인합니다. 이것은 죽여야하는 Android 스튜디오의 "유령"프로세스입니다.
  • git revert : 최신 코드를 숨기거나 되돌려보십시오. 때로는 Android Studio / gradle이 놓친 컴파일 오류가 있으며 컴파일 할 수없는 코드를 실행하려고 시도합니다.
  • Android Studio를 제거한 다음 다시 설치하십시오.

나는 그들을 만나면 더 많은 수정 사항을 추가 할 것입니다!


0

나는 아무것도하지 않았고 반나절의 고통 후에 문제가 사라지고 프로젝트를 여러 번 열고 닫았으며 각 수업 테스트를 수동으로 실행했으며 아마도 내 문제가 해결되었을 수 있습니다.


0

spock 프레임 워크가있는 Android 스튜디오에서 gradle의 버전을 2.2.2에서 3.2.1로 변경했으며 모든 것이 잘 진행됩니다.


0

받아 들여진 대답은 내 문제를 해결하지 못했습니다. 그래서 ExampleInstrumentedTestAndroid Studio에서 기본적으로 생성되어 문제없이 실행되는 복사 를 결정 하고 복사 프로세스 중에 이름을 변경하고 (복사 후 Refactor-> Rename!) 내 단위 테스트의 내용을 붙여 넣었습니다. 그 후 오류가 사라졌습니다.


0

Android Studio 3.0 프로젝트에서 로컬 단위 테스트를 실행하려고 할 때 "Empty test suite"오류가 발생했습니다.

Android 개발자 문서를 읽은 후 문제가 다음 줄을 포함하는 내 gradle 구성으로 인해 발생했음을 금방 깨달았습니다.

testImplementation 'com.android.support.test:runner:0.5'
testImplementation 'com.android.support.test:rules:0.5'

AndroidJUnitRunner 클래스는 Android 기기 에서 JUnit 3 또는 JUnit 4 스타일 테스트 클래스를 실행할 수있는 JUnit 테스트 실행기입니다. .

내 테스트는 로컬이어서 어떤 기기에서도 실행할 필요가 없기 때문에 위의 com.android.support.test ... 항목을 제거하면 단위 테스트를 실행할 수있었습니다.


0

@BeforeClass 메서드에서 db에 몇 가지 삽입을 수행했습니다. 개체 / 데이터베이스 매핑 문제가 있음을 깨달았습니다. 이 데이터 매핑 문제가이 문제의 원인이었습니다.


0

제 경우에는에서 계측 테스트를 androidTest/java/<package.name>/MyTestingClass받았지만 현재 빌드 변형을 "사전 프로덕션"으로 설정했습니다. 그리고 요점이 있습니다! Android Studio 문서에 지정된대로 :

기본적으로 모든 테스트는 디버그 빌드 유형에 대해 실행됩니다.

Class not found. Empty test suite.이렇게 할 때까지 메시지가 계속 나타납니다.

  1. build.gradle에 다음 줄을 추가하십시오 .

    android{
        [...]
        testBuildType "preproduction"
    }
  2. 동기화 된 gradle.
  3. 이 Gradle 동기화를 고려하지 않으므로 이전 테스트 구성을 삭제하십시오.

그런 다음 다시 테스트를 실행했고 이번에는 완벽하게 실행됩니다 !!!


0

주석이 아닌 모의 클래스 변수를 주석으로 잘못 표시했을 때 이런 일이 발생했습니다. 주석이 @Mock 제거되고 테스트가 성공적으로 실행되었습니다. 이것은 Android Studio의 Junit 4.5에서 발생했습니다.


0

해결책은 아니지만 신속하게 궤도로 돌아갈 수있는 해결 방법입니다.

  1. 먼저 작동하는 테스트를 찾으십시오. '빈 테스트 스위트'오류가 발생한 새 테스트를 작성했습니다. 다른 테스트를 실행했는데 평소와 같이 작동했습니다.

  2. 작동하는 테스트 파일을 복사하십시오. 이 복사본이 원본처럼 작동하는지 확인하려면 실행하십시오.

  3. 본체를 제거하고 새 테스트 코드로 교체하십시오.

이제 테스트가 작동합니다.

원인을 찾으려고 약 2 시간을 보냈지 만 소용이 없었습니다.

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