6월 3일의 ⁠#Android11: 베타 버전 출시 행사에 참여하세요.

계측 단위 테스트 빌드

계측 단위 테스트는 실제 기기 및 에뮬레이터에서 실행되는 테스트이며 Android 프레임워크 API 및 지원 API(예: AndroidX 테스트)를 활용할 수 있습니다. 계측 테스트는 로컬 단위 테스트보다 더 높은 충실도를 제공하지만 훨씬 더 느리게 실행됩니다. 따라서 실제 기기의 동작에 관해 테스트해야 하는 경우에만 계측 단위 테스트를 사용하는 것이 좋습니다. AndroidX 테스트는 필요한 경우 계측 단위 테스트를 보다 쉽게 작성할 수 있도록 하는 여러 라이브러리를 제공합니다. 예를 들어 Android Builder 클래스를 사용하면 빌드하기 어려운 Android 데이터 개체를 보다 쉽게 만들 수 있습니다.

참고: 테스트가 고유한 종속성에 의존하는 경우 고유한 가짜 종속성을 제공하거나 Mockito와 같은 모의 프레임워크를 사용하여 종속성을 모의 구현하세요.

테스트 환경 설정

Android 스튜디오 프로젝트에서는 계측 테스트의 소스 파일을 module-name/src/androidTest/java/에 저장해야 합니다. 이 디렉터리는 새 프로젝트를 만들 때 이미 존재하며 예제 계측 테스트를 포함합니다.

시작하기 전에 앱의 계측 테스트 코드를 빠르게 빌드하고 실행할 수 있는 AndroidX 테스트 API를 추가해야 합니다. AndroidX 테스트에는 JUnit 4 테스트 실행기(AndroidJUnitRunner) 및 기능적 UI 테스트용 API(EspressoUI Automator)가 포함되어 있습니다.

또한 AndroidX 테스트에서 제공하는 테스트 실행기와 규칙 API를 사용하도록 프로젝트의 Android 테스트 종속성을 구성해야 합니다. 테스트 개발을 단순화하려면 Hamcrest 매처 API를 사용하여 보다 유연한 어설션을 만들 수 있는 Hamcrest 라이브러리도 포함해야 합니다.

앱의 최상위 수준 build.gradle 파일에서 이러한 라이브러리를 종속성으로 지정해야 합니다.

    dependencies {
        androidTestImplementation 'androidx.test:runner:1.1.0'
        androidTestImplementation 'androidx.test:rules:1.1.0'
        // Optional -- Hamcrest library
        androidTestImplementation 'org.hamcrest:hamcrest-library:1.3'
        // Optional -- UI testing with Espresso
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
        // Optional -- UI testing with UI Automator
        androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
    }
    

JUnit 4 테스트 클래스를 사용하려면 앱의 모듈 수준 build.gradle 파일에 다음 설정을 포함하여 프로젝트에서 AndroidJUnitRunner를 기본 테스트 계측 실행기로 지정해야 합니다.

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

계측 단위 테스트 클래스 만들기

계측 단위 테스트 클래스는 로컬 단위 테스트 클래스를 만드는 방법과 관련된 섹션에서 설명된 클래스와 유사한 JUnit 4 테스트 클래스여야 합니다.

계측 JUnit 4 테스트 클래스를 만들려면 AndroidJUnit4를 기본 테스트 실행기로 지정하세요.

참고: 테스트 모음이 JUnit3 및 JUnit4 라이브러리의 혼합에 종속된 경우 테스트 클래스 정의의 시작 부분에 @RunWith(AndroidJUnit4::class) 주석을 추가하세요.

다음 예는 Parcelable 인터페이스가 LogHistory 클래스에 맞게 올바르게 구현되었는지 확인하기 위해 계측 단위 테스트를 작성하는 방법을 보여줍니다.

Kotlin

    import android.os.Parcel
    import android.text.TextUtils.writeToParcel
    import androidx.test.filters.SmallTest
    import androidx.test.runner.AndroidJUnit4
    import com.google.common.truth.Truth.assertThat
    import org.junit.Before
    import org.junit.Test
    import org.junit.runner.RunWith

    const val TEST_STRING = "This is a string"
    const val TEST_LONG = 12345678L

    // @RunWith is required only if you use a mix of JUnit3 and JUnit4.
    @RunWith(AndroidJUnit4::class)
    @SmallTest
    class LogHistoryAndroidUnitTest {
        private lateinit var logHistory: LogHistory

        @Before
        fun createLogHistory() {
            logHistory = LogHistory()
        }

        @Test
        fun logHistory_ParcelableWriteRead() {
            val parcel = Parcel.obtain()
            logHistory.apply {
                // Set up the Parcelable object to send and receive.
                addEntry(TEST_STRING, TEST_LONG)

                // Write the data.
                writeToParcel(parcel, describeContents())
            }

            // After you're done with writing, you need to reset the parcel for reading.
            parcel.setDataPosition(0)

            // Read the data.
            val createdFromParcel: LogHistory = LogHistory.CREATOR.createFromParcel(parcel)
            createdFromParcel.getData().also { createdFromParcelData: List<Pair<String, Long>> ->

                // Verify that the received data is correct.
                assertThat(createdFromParcelData.size).isEqualTo(1)
                assertThat(createdFromParcelData[0].first).isEqualTo(TEST_STRING)
                assertThat(createdFromParcelData[0].second).isEqualTo(TEST_LONG)
            }
        }
    }

    

자바

    import android.os.Parcel;
    import android.util.Pair;
    import androidx.test.filters.SmallTest;
    import androidx.test.runner.AndroidJUnit4;
    import com.google.common.truth.Truth.assertThat;
    import java.util.List;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;

    // @RunWith is required only if you use a mix of JUnit3 and JUnit4.
    @RunWith(AndroidJUnit4.class)
    @SmallTest
    public class LogHistoryAndroidUnitTest {

        public static final String TEST_STRING = "This is a string";
        public static final long TEST_LONG = 12345678L;
        private LogHistory mLogHistory;

        @Before
        public void createLogHistory() {
            mLogHistory = new LogHistory();
        }

        @Test
        public void logHistory_ParcelableWriteRead() {
            // Set up the Parcelable object to send and receive.
            mLogHistory.addEntry(TEST_STRING, TEST_LONG);

            // Write the data.
            Parcel parcel = Parcel.obtain();
            mLogHistory.writeToParcel(parcel, mLogHistory.describeContents());

            // After you're done with writing, you need to reset the parcel for reading.
            parcel.setDataPosition(0);

            // Read the data.
            LogHistory createdFromParcel = LogHistory.CREATOR.createFromParcel(parcel);
            List<Pair<String, Long>> createdFromParcelData
                    = createdFromParcel.getData();

            // Verify that the received data is correct.
            assertThat(createdFromParcelData.size()).isEqualTo(1);
            assertThat(createdFromParcelData.get(0).first).isEqualTo(TEST_STRING);
            assertThat(createdFromParcelData.get(0).second).isEqaulTo(TEST_LONG);
        }
    }
    

테스트 모음 만들기

계측 단위 테스트 실행을 구성하려면 테스트 클래스 모음을 테스트 모음 클래스에 그룹화하고 이러한 테스트를 함께 실행하면 됩니다. 테스트 모음은 중첩될 수 있으며, 다른 테스트 모음을 그룹화하고 모든 구성요소 테스트 클래스를 함께 실행할 수 있습니다.

테스트 모음은 기본 애플리케이션 패키지와 유사한 테스트 패키지에 포함됩니다. 일반적으로 테스트 모음 패키지 이름은 .suite 접미사로 끝납니다(예: com.example.android.testing.mysample.suite).

단위 테스트를 위한 테스트 모음을 만들려면 JUnit RunWithSuite 클래스를 가져오세요. 테스트 모음에 @RunWith(Suite.class)@Suite.SuitClasses() 주석을 추가하세요. @Suite.SuiteClasses() 주석에서 개별 테스트 클래스 또는 테스트 모음을 인수로 나열하세요.

다음 예는 CalculatorInstrumentationTestCalculatorAddParameterizedTest 테스트 클래스를 함께 그룹화하여 실행하는 UnitTestSuite라는 테스트 모음을 구현하는 방법을 보여줍니다.

Kotlin

    import com.example.android.testing.mysample.CalculatorAddParameterizedTest
    import com.example.android.testing.mysample.CalculatorInstrumentationTest
    import org.junit.runner.RunWith
    import org.junit.runners.Suite

    // Runs all unit tests.
    @RunWith(Suite::class)
    @Suite.SuiteClasses(CalculatorInstrumentationTest::class,
            CalculatorAddParameterizedTest::class)
    class UnitTestSuite
    

자바

    import com.example.android.testing.mysample.CalculatorAddParameterizedTest;
    import com.example.android.testing.mysample.CalculatorInstrumentationTest;
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;

    // Runs all unit tests.
    @RunWith(Suite.class)
    @Suite.SuiteClasses({CalculatorInstrumentationTest.class,
            CalculatorAddParameterizedTest.class})
    public class UnitTestSuite {}
    

계측 단위 테스트 실행

계측 테스트를 실행하려면 다음 단계를 따르세요.

  1. 툴바에서 Sync Project 를 클릭하여 프로젝트가 Gradle과 동기화되도록 합니다.
  2. 다음 방법 중 하나로 테스트를 실행합니다.
    • 단일 테스트를 실행하려면 Project 창을 연 다음 테스트를 마우스 오른쪽 버튼으로 클릭하고 Run 을 클릭합니다.
    • 클래스의 모든 메서드를 테스트하려면 테스트 파일에 있는 클래스 또는 메서드를 마우스 오른쪽 버튼으로 클릭하고 Run 을 클릭합니다.
    • 디렉터리에 있는 모든 테스트를 실행하려면 디렉터리를 마우스 오른쪽 버튼으로 클릭하고 Run tests 를 선택합니다.

Gradle용 Android 플러그인이 기본 디렉터리(src/androidTest/java/)에 있는 계측 테스트 코드를 컴파일하고, 테스트 APK 및 프로덕션 APK를 빌드하고, 연결된 기기나 에뮬레이터에 두 APK를 모두 설치하고, 테스트를 실행합니다. 그런 다음 Android 스튜디오에서 Run 창에 계측 테스트 실행 결과를 표시합니다.

Firebase Test Lab으로 테스트 실행

Firebase Test Lab을 사용하여 다수의 인기 있는 Android 기기 및 기기 구성(언어, 방향, 화면 크기 및 플랫폼 버전)에서 동시에 앱을 테스트할 수 있습니다. 이러한 테스트는 원격 Google 데이터 센터의 실제 기기와 가상 기기에서 실행됩니다. 명령줄이나 Android 스튜디오에서 직접 Test Lab에 앱을 배포할 수 있습니다. 테스트 결과에 테스트 로그가 제공되고 앱 실패 세부정보가 포함됩니다.

Google 계정과 Firebase 프로젝트가 없다면 Firebase Test Lab 사용을 시작하기 전에 다음 단계를 따라야 합니다.

  1. Google 계정을 만듭니다.
  2. Firebase Console에서 새 프로젝트 만들기를 클릭합니다.

    Spark 플랜의 무료 일일 할당량 이내라면 Test Lab에서 앱을 테스트할 때 비용이 무료입니다.

테스트 매트릭스 구성 및 테스트 실행

Android 스튜디오에서는 Firebase Test Lab에 테스트를 배포하는 방법을 구성할 수 있는 통합 도구를 제공합니다. Blaze 요금제 청구로 Firebase 프로젝트를 만든 후 테스트 구성을 만들고 테스트를 실행할 수 있습니다.

  1. 기본 메뉴에서 Run > Edit Configurations를 클릭합니다.
  2. Add New Configuration 을 클릭하고 Android Tests를 선택합니다.
  3. Android 테스트 구성 대화상자에서 다음 단계를 따릅니다.
    1. 테스트 이름, 모듈 유형, 테스트 유형 및 테스트 클래스와 같은 테스트 세부정보를 입력하거나 선택합니다.
    2. Deployment Target Options 아래의 Target 드롭다운 메뉴에서 Firebase Test Lab Device Matrix를 선택합니다.
    3. 로그인하지 않은 경우 Connect to Google Cloud Platform을 클릭하고 Android 스튜디오에서 계정에 액세스할 수 있도록 허용합니다.
    4. Cloud Project 옆에 있는 버튼을 클릭하고 목록에서 Firebase 프로젝트를 선택합니다.
  4. 다음과 같이 테스트 매트릭스를 만들고 구성합니다.
    1. Matrix Configuration 드롭다운 목록 옆에 있는 Open Dialog 를 클릭합니다.
    2. Add New Configuration (+)을 클릭합니다.
    3. Name 필드에 새 구성의 이름을 입력합니다.
    4. 앱을 테스트할 기기, Android 버전, 언어 및 화면 방향을 선택합니다. Firebase Test Lab이 테스트 결과 생성 시 선택한 모든 조합에 관해 앱을 테스트합니다.
    5. OK를 클릭하여 구성을 저장합니다.
  5. Run/Debug Configurations 대화상자에서 OK를 클릭하여 종료합니다.
  6. Run 을 클릭하여 테스트를 실행합니다.

그림 1. Firebase Test Lab의 테스트 구성 만들기

테스트 결과 분석

Firebase Test Lab이 테스트 실행을 완료하면 그림 2에서와 같이 Run 창이 열리고 결과가 표시됩니다. 실행된 모든 테스트를 보려면 Show Passed 를 클릭해야 할 수도 있습니다.

그림 2. Firebase Test Lab을 사용한 계측 테스트의 결과 보기

Run 창에서 테스트 실행 로그의 시작 부분에 표시된 링크를 따라 웹에서 테스트를 분석할 수도 있습니다.

추가 자료

웹 결과를 해석하는 방법을 자세히 알아보려면 Android용 Firebase Test Lab 결과 분석을 참조하세요.

참고 자료

Android 테스트에서 Espresso를 사용하는 방법에 관한 자세한 내용은 다음 자료를 참조하세요.

샘플

Codelab