고급 테스트 설정

Android 스튜디오에서 테스트명령줄에서 테스트 페이지에서는 기본 테스트 구성을 설정하고 실행하는 방법을 설명합니다. 그러나 애플리케이션 및 테스트의 요구사항이 더 복잡해지면 테스트 구성을 추가로 조정해야 할 수도 있습니다. 예를 들어 다음을 실행하려면 고급 테스트 설정이 필요할 수 있습니다.

  • 특정 빌드 변형에만 적용되는 계측 테스트를 실행하거나 매니페스트 설정을 재정의합니다.
  • 테스트를 실행하는 빌드 유형을 변경하거나 Gradle 옵션을 구성합니다.
  • 계측 테스트를 자체 테스트 모듈로 추출합니다.

이 페이지에서는 기본 설정이 현재 사용 사례에 맞지 않을 때 테스트를 구성하는 다양한 방법을 설명합니다.

빌드 변형의 계측 테스트 작성

프로젝트에 고유한 소스 세트를 갖는 빌드 변형이 포함되어 있는 경우 그러한 소스 세트에 상응하는 계측 테스트를 포함하는 것이 좋습니다. 이를 통해 테스트 코드를 체계적으로 유지하고 특정 빌드 변형에 적용되는 테스트만 실행할 수 있습니다.

계측 테스트를 src/androidTestVariantName에 있는 자체 소스 세트에 배치하여 빌드 변형에 연결할 수 있습니다.

src/androidTest/ 소스 세트에 포함된 계측 테스트는 모든 빌드 변형에서 공유됩니다. 앱의 'MyFlavor' 변형에 대한 테스트 APK를 빌드하는 경우 Gradle이 src/androidTest/src/androidTestMyFlavor/ 소스 세트를 결합합니다.

Android 스튜디오에서 빌드 변형의 테스트 소스 세트를 추가하려면 다음 단계를 따르세요.

  1. 왼쪽의 Project 창에서 드롭다운 메뉴를 클릭한 다음 Project 뷰를 선택합니다.
  2. 적합한 모듈 폴더 내에 있는 src 폴더를 마우스 오른쪽 버튼으로 클릭하고 New > Directory를 클릭합니다.
  3. 디렉터리 이름으로 'androidTestVariantName'을 입력합니다. 예를 들어 'MyFlavor'라는 빌드 변형이 있는 경우 디렉터리 이름은 'androidTestMyFlavor'입니다. 이름을 입력한 후 OK를 클릭합니다.
  4. 새 디렉터리를 마우스 오른쪽 버튼으로 클릭하고 New > Directory를 클릭합니다.
  5. 디렉터리 이름으로 'java'를 입력한 후 OK를 클릭합니다.

이제 새 테스트 추가 단계에 따라 이 새로운 소스 세트에 테스트를 추가할 수 있습니다. Choose Destination Directory 대화상자에 도달하면 새 변형 테스트 소스 세트를 선택합니다.

다음 표는 앱의 코드 소스 세트에 대응되는 테스트 소스 세트 내에 계측 테스트 파일이 어떻게 배치되는지를 보여줍니다.

표 1. 앱 소스 코드 및 상응하는 계측 테스트 파일

앱 클래스 경로 일치하는 계측 테스트 클래스 경로
src/main/java/Foo.java src/androidTest/java/AndroidFooTest.java
src/myFlavor/java/Foo.java src/androidTestMyFlavor/java/AndroidFooTest.java

앱 소스 세트와 마찬가지로 Gradle 빌드는 다양한 테스트 소스 세트의 파일도 병합하고 재정의합니다. 이 경우 androidTestMyFlavor 소스 세트의 AndroidFooTest.java 파일이 androidTest 소스 세트의 버전을 재정의합니다. 제품 버전 소스 세트가 기본 소스 세트보다 우선순위가 높기 때문입니다. 소스 세트의 병합 방식에 관한 자세한 내용은 빌드 구성을 참고하세요.

계측 매니페스트 설정 구성

계측 테스트는 자체 AndroidManifest.xml 파일과 함께 별도의 APK에 빌드됩니다. Gradle은 테스트 APK를 빌드할 때 AndroidManifest.xml 파일을 자동으로 생성하고 <instrumentation> 노드로 이 파일을 구성합니다. Gradle이 자동으로 이 노드를 구성하는 이유 중 하나는 targetPackage 속성이 테스트 대상 앱의 패키지 이름을 올바르게 지정하도록 만들기 위해서입니다. 이 노드의 다른 일부 설정을 변경하려면 또 다른 매니페스트 파일을 테스트 소스 세트에 만들거나 모듈 수준 build.gradle 파일을 구성하면 됩니다(다음 코드 샘플 참고). 전체 옵션 목록은 BaseFlavor API 참조에서 확인할 수 있습니다.

android {

    ...

    // Each product flavor you configure can override properties in the
    // defaultConfig {} block. To learn more, go to Configure product flavors.

    defaultConfig {

        ...

        // Specifies the application ID for the test APK.
        testApplicationId = "com.test.foo"

        // Specifies the fully-qualified class name of the test instrumentation
        // runner.
        testInstrumentationRunner = "android.test.InstrumentationTestRunner"

        // If set to true, enables the instrumentation class to start and stop profiling.
        // If set to false (default), profiling occurs the entire time the instrumentation
        // class is running.
        testHandleProfiling = true

        // If set to true, indicates that the Android system should run the instrumentation
        // class as a functional test. The default value is false.
        testFunctionalTest = true

    }
}

테스트 빌드 유형 변경

기본적으로 모든 계측 테스트는 debug 빌드 유형을 대상으로 실행됩니다. 모듈 수준 build.gradle 파일에서 testBuildType 속성을 사용하여 이 빌드 유형을 또 다른 빌드 유형으로 변경할 수 있습니다. 예를 들어 staging 빌드 유형을 대상으로 테스트를 실행하려면 다음 스니펫에 표시된 대로 파일을 수정합니다.

android {

    ...

    testBuildType "staging"

}

Gradle 테스트 옵션 구성

Android Gradle 플러그인을 사용하면 전체 테스트 또는 일부 테스트에서만 특정 옵션을 지정할 수 있습니다. 모듈 수준 build.gradle 파일에서 testOptions{} 블록을 사용하여 Gradle이 모든 테스트를 실행하는 방식을 변경하는 옵션을 지정하세요.

Groovy

android {
    ...
    // Encapsulates options for running tests.
    testOptions {
        // Changes the directory where Gradle saves test reports. By default,
        // Gradle saves test reports in the
        // path_to_your_project/module_name/build/outputs/reports/ directory.
        // '$rootDir' sets the path relative to the root directory of the
        // current project.
        reportDir "$rootDir/test-reports"
        // Changes the directory where Gradle saves test results. By default,
        // Gradle saves test results in the
        // path_to_your_project/module_name/build/outputs/test-results/ directory.
        // '$rootDir' sets the path relative to the root directory of the
        // current project.
        resultsDir "$rootDir/test-results"
    }
}

Kotlin

android {
    ...
    // Encapsulates options for running tests.
    testOptions {
        // Changes the directory where Gradle saves test reports. By default,
        // Gradle saves test reports in the
        // path_to_your_project/module_name/build/outputs/reports/ directory.
        // '$rootDir' sets the path relative to the root directory of the
        // current project.
        reportDir "$rootDir/test-reports"
        // Changes the directory where Gradle saves test results. By default,
        // Gradle saves test results in the
        // path_to_your_project/module_name/build/outputs/test-results/ directory.
        // '$rootDir' sets the path relative to the root directory of the
        // current project.
        resultsDir = "$rootDir/test-results"
    }
}

로컬 단위 테스트에만 옵션을 지정하려면 testOptions{} 내에서 unitTests{} 블록을 구성합니다.

Groovy

android {
    ...
    testOptions {
        ...
        // Encapsulates options for local unit tests.
        unitTests {
            // By default, local unit tests throw an exception any time the code
            // you are testing tries to access Android platform APIs (unless you
            /// mock Android dependencies yourself or with a testing framework like Mockito).
            // However, you can enable the following property so that the test
            // returns either null or zero when accessing platform APIs, rather
            // than throwing an exception.
            returnDefaultValues true

            // Encapsulates options for controlling how Gradle executes local
            // unit tests. For a list of all the options you can specify, read
            // Gradle's reference documentation.
            all {
                // Sets JVM argument(s) for the test JVM(s).
                jvmArgs '-XX:MaxPermSize=256m'

                // You can also check the task name to apply options to only the
                // tests you specify.
                if (it.name == 'testDebugUnitTest') {
                    systemProperty 'debug', 'true'
                }
                ...
            }
        }
    }
}

Kotlin

android {
    ...
    testOptions {
        ...
        // Encapsulates options for local unit tests.
        unitTests {
            // By default, local unit tests throw an exception any time the code
            // you are testing tries to access Android platform APIs (unless you
            /// mock Android dependencies yourself or with a testing framework like Mockito).
            // However, you can enable the following property so that the test
            // returns either null or zero when accessing platform APIs, rather
            // than throwing an exception.
            returnDefaultValues = true

            // Encapsulates options for controlling how Gradle executes local
            // unit tests. For a list of all the options you can specify, read
            // Gradle's reference documentation.
            all {
                // Sets JVM argument(s) for the test JVM(s).
                jvmArgs = listOf("-XX:MaxPermSize=256m")

                // You can also check the task name to apply options to only the
                // tests you specify.
                if (it.name == "testDebugUnitTest") {
                    systemProperty = mapOf("debug" to "true")
                }
                ...
            }
        }
    }
}

계측 테스트용으로 별도의 테스트 모듈 사용하기

한 모듈을 계측 테스트 전용으로 사용하고 코드의 나머지 부분을 테스트에서 격리하려는 경우 별도의 테스트 모듈을 만들고 라이브러리 모듈과 비슷하게 빌드를 구성하면 됩니다. 테스트 모듈을 만들려면 다음 단계를 진행하세요.

  1. 라이브러리 모듈을 만듭니다.
  2. 모듈 수준 build.gradle 파일에서 com.android.library 대신 com.android.test 플러그인을 적용합니다.
  3. Sync Project 를 클릭하여 프로젝트를 동기화합니다.

테스트 모듈을 만든 후에 기본 소스 세트나 변형 소스 세트(예: src/main/java 또는 src/variant/java)에 테스트 코드를 포함할 수 있습니다. 앱 모듈에서 여러 제품 버전을 정의하는 경우 테스트 모듈에 이러한 버전을 다시 만들 수 있으며, 이때 테스트 모듈은 변형 인식 종속 항목 관리를 사용하여 타겟 모듈 내의 일치하는 버전을 테스트하려고 시도합니다.

기본적으로 테스트 모듈은 디버그 변형만 포함하고 테스트합니다. 하지만 테스트할 앱 프로젝트와 일치하는 새로운 빌드 유형을 만들 수도 있습니다. 테스트 모듈이 디버그 변형이 아닌 다른 빌드 유형을 테스트하게 하려면 다음과 같이 VariantFilter를 사용하여 테스트 프로젝트의 디버그 변형을 사용 중지하세요.

Groovy

android {
    variantFilter { variant ->
        if (variant.buildType.name.equals('debug')) {
            variant.setIgnore(true);
        }
    }
}

Kotlin

android {
    variantFilter {
        if (buildType.name == "debug") {
            ignore = true
        }
    }
}

테스트 모듈에서 특정 버전이나 앱 빌드 유형만 타겟팅하려면 matchingFallbacks 속성을 사용하여 테스트하려는 변형만 타겟팅할 수 있습니다. 이렇게 하면 테스트 모듈에서 해당 변형을 직접 구성할 필요도 없습니다.