계측 단위 테스트는 실제 기기 및 에뮬레이터에서 실행되는 테스트이며 Android 프레임워크 API 및 지원 API(예: AndroidX 테스트)를 활용할 수 있습니다. 계측 테스트는 로컬 단위 테스트보다 더 높은 충실도를 제공하지만 훨씬 더 느리게 실행됩니다. 따라서 실제 기기의 동작에 관해 테스트해야 하는 경우에만 계측 단위 테스트를 사용하는 것이 좋습니다. AndroidX 테스트는 필요한 경우 계측 단위 테스트를 보다 쉽게 작성할 수 있도록 하는 여러 라이브러리를 제공합니다. 예를 들어 Android Builder 클래스를 사용하면 빌드하기 어려운 Android 데이터 객체를 더 쉽게 만들 수 있습니다.
참고: 테스트가 고유한 종속 항목에 의존한다면 고유한 가짜 종속 항목을 제공하거나 Mockito와 같은 모의 프레임워크를 사용하여 종속 항목을 모의 구현하세요.
테스트 환경 설정
Android 스튜디오 프로젝트에서는 계측 테스트의 소스 파일을 module-name/src/androidTest/java/
에 저장해야 합니다. 이 디렉터리는 새 프로젝트를 만들 때 이미 존재하며 계측 테스트 예를 포함합니다.
시작하기 전에 앱의 계측 테스트 코드를 빠르게 빌드하고 실행할 수 있는 AndroidX 테스트 API를 추가해야 합니다. AndroidX 테스트에는 JUnit 4 테스트 실행기(AndroidJUnitRunner
) 및 기능적 UI 테스트용 API(Espresso 및 UI 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 RunWith
및 Suite
클래스를 가져오세요. 테스트 모음에서 @RunWith(Suite.class)
및 @Suite.SuitClasses()
주석을 추가하세요. @Suite.SuiteClasses()
주석에서 개별 테스트 클래스 또는 테스트 모음을 인수로 나열하세요.
다음 예는 CalculatorInstrumentationTest
및 CalculatorAddParameterizedTest
테스트 클래스를 함께 그룹화하여 실행하는 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 {}
계측 단위 테스트 실행
계측 테스트를 실행하려면 다음 단계를 따르세요.
- 툴바에서 Sync Project
를 클릭하여 프로젝트가 Gradle과 동기화되도록 합니다.
- 다음 방법 중 하나로 테스트를 실행합니다.
- 단일 테스트를 실행하려면 Project 창을 연 후 테스트를 마우스 오른쪽 버튼으로 클릭하고 Run
을 클릭합니다.
- 클래스의 모든 메서드를 테스트하려면 테스트 파일에 있는 클래스 또는 메서드를 마우스 오른쪽 버튼으로 클릭하고 Run
을 클릭합니다.
- 디렉터리에 있는 모든 테스트를 실행하려면 디렉터리를 마우스 오른쪽 버튼으로 클릭하고 Run tests
를 선택합니다.
- 단일 테스트를 실행하려면 Project 창을 연 후 테스트를 마우스 오른쪽 버튼으로 클릭하고 Run
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 사용을 시작하기 전에 다음 단계를 따라야 합니다.
- 아직 계정이 없다면 Google 계정을 만듭니다.
- Firebase Console에서 새 프로젝트 만들기를 클릭합니다.
Spark 요금제의 무료 일일 할당량 이내라면 Test Lab에서 앱을 테스트하는 데 비용이 들지 않습니다.
테스트 매트릭스 구성 및 테스트 실행
Android 스튜디오에서는 Firebase Test Lab에 테스트를 배포하는 방법을 구성할 수 있는 통합 도구를 제공합니다. Blaze 요금제 청구로 Firebase 프로젝트를 만든 후 테스트 구성을 만들고 테스트를 실행할 수 있습니다.
- 기본 메뉴에서 Run > Edit Configurations를 클릭합니다.
- Add New Configuration
을 클릭하고 Android Tests를 선택합니다.
- Android 테스트 구성 대화상자에서 다음 단계를 따릅니다.
- 테스트 이름, 모듈 유형, 테스트 유형 및 테스트 클래스와 같은 테스트 세부정보를 입력하거나 선택합니다.
- Deployment Target Options 아래의 Target 드롭다운 메뉴에서 Firebase Test Lab Device Matrix를 선택합니다.
- 로그인하지 않은 경우 Connect to Google Cloud Platform을 클릭하고 Android 스튜디오에서 계정에 액세스할 수 있도록 허용합니다.
- Cloud Project 옆에 있는
버튼을 클릭하고 목록에서 Firebase 프로젝트를 선택합니다.
- 다음과 같이 테스트 매트릭스를 만들고 구성합니다.
- Matrix Configuration 드롭다운 목록 옆에 있는 Open Dialog
를 클릭합니다.
- Add New Configuration (+)을 클릭합니다.
- Name 필드에 새 구성의 이름을 입력합니다.
- 앱을 테스트할 기기, Android 버전, 언어 및 화면 방향을 선택합니다. Firebase Test Lab이 테스트 결과 생성 시 선택한 모든 조합에 관해 앱을 테스트합니다.
- OK를 클릭하여 구성을 저장합니다.
- Matrix Configuration 드롭다운 목록 옆에 있는 Open Dialog
- Run/Debug Configurations 대화상자에서 OK를 클릭하여 종료합니다.
- Run
을 클릭하여 테스트를 실행합니다.

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

그림 2. Firebase Test Lab을 사용한 계측 테스트의 결과 보기
Run 창에서 테스트 실행 로그의 시작 부분에 표시된 링크를 따라 웹에서 테스트를 분석할 수도 있습니다.
추가 자료
웹 결과를 해석하는 방법을 자세히 알아보려면 Android용 Firebase Test Lab 결과 분석을 참조하세요.
참고 자료
Android 테스트에서 Espresso를 사용하는 방법에 관한 자세한 내용은 다음 자료를 참조하세요.