서비스 테스트

로컬 Service를 앱의 구성요소로 구현하려면 Service를 테스트하여 예상치 못한 방식으로 작동하지 않는지 확인해야 합니다. Service의 동작이 올바른지 확인하는 계측 단위 테스트를 만들 수 있습니다. 예를 들어 서비스가 올바른 데이터 값을 저장하고 반환하며 데이터 작업을 올바르게 실행하는지 확인합니다.

AndroidX 테스트Service 객체를 격리된 상태로 테스트하기 위한 API를 제공합니다. ServiceTestRule 클래스는 단위 테스트 메서드가 실행되기 전에 서비스를 시작하고 테스트가 완료된 후 서비스를 종료하는 JUnit 4 규칙입니다. 이 테스트 규칙을 사용하여 항상 테스트 메서드가 실행되기 전에 서비스 연결이 설정되어 있는지 확인합니다. JUnit 4 규칙에 관해 자세히 알아보려면 JUnit 문서를 참조하세요.

참고: ServiceTestRule 클래스는 IntentService 객체의 테스트를 지원하지 않습니다. IntentService 객체를 테스트해야 한다면 로직을 별도의 클래스에 캡슐화하고 대신 해당하는 단위 테스트를 만들어야 합니다.

테스트 환경 설정

서비스를 위한 통합 테스트를 빌드하기 전에 AndroidX 테스트용 프로젝트 설정에 설명된 대로 계측 테스트용 프로젝트를 구성해야 합니다.

서비스의 통합 테스트 만들기

통합 테스트는 JUnit 4 테스트 클래스로 작성해야 합니다. JUnit 4 테스트 클래스를 만드는 방법과 JUnit 4 어설션 메서드를 사용하는 방법을 자세히 알아보려면 계측 단위 테스트 클래스 만들기를 참조하세요.

서비스의 통합 테스트를 만들려면 테스트 클래스 정의의 시작 부분에 @RunWith(AndroidJUnit4::class) 주석을 추가합니다. 또한 AndroidX 테스트에서 제공하는 AndroidJUnitRunner 클래스를 기본 테스트 실행기로 지정해야 합니다. 이 단계는 계측 단위 테스트 실행에 자세히 설명되어 있습니다.

다음으로 @Rule 주석을 사용하여 테스트에 ServiceTestRule 인스턴스를 생성합니다.

Kotlin

    @get:Rule
    val serviceRule = ServiceTestRule()
    

자바

    @Rule
    public final ServiceTestRule serviceRule = new ServiceTestRule();
    

다음 예에서는 서비스의 통합 테스트를 구현하는 방법을 보여줍니다. 테스트 메서드 testWithBoundService는 앱이 로컬 서비스에 결합되었으며 서비스 인터페이스가 올바르게 작동하는지 확인합니다.

Kotlin

    @Test
    @Throws(TimeoutException::class)
    fun testWithBoundService() {
        // Create the service Intent.
        val serviceIntent = Intent(
                ApplicationProvider.getApplicationContext<Context>(),
                LocalService::class.java
        ).apply {
            // Data can be passed to the service via the Intent.
            putExtra(SEED_KEY, 42L)
        }

        // Bind the service and grab a reference to the binder.
        val binder: IBinder = serviceRule.bindService(serviceIntent)

        // Get the reference to the service, or you can call
        // public methods on the binder directly.
        val service: LocalService = (binder as LocalService.LocalBinder).getService()

        // Verify that the service is working correctly.
        assertThat(service.getRandomInt(), `is`(any(Int::class.java)))
    }
    

자바

    @Test
    public void testWithBoundService() throws TimeoutException {
        // Create the service Intent.
        Intent serviceIntent =
                new Intent(ApplicationProvider.getApplicationContext(),
                    LocalService.class);

        // Data can be passed to the service via the Intent.
        serviceIntent.putExtra(LocalService.SEED_KEY, 42L);

        // Bind the service and grab a reference to the binder.
        IBinder binder = serviceRule.bindService(serviceIntent);

        // Get the reference to the service, or you can call
        // public methods on the binder directly.
        LocalService service =
                ((LocalService.LocalBinder) binder).getService();

        // Verify that the service is working correctly.
        assertThat(service.getRandomInt()).isAssignableTo(Integer.class);
    }
    

서비스의 통합 테스트 실행

Android 스튜디오 또는 명령줄에서 통합 테스트를 실행할 수 있습니다. AndroidJUnitRunner를 프로젝트의 기본 계측 실행기로 지정해야 합니다.

서비스의 통합 테스트를 실행하려면 테스트 시작하기에 설명된 계측 테스트 실행 단계를 따르세요.

서비스도 참조하세요.

참고 자료

이 주제에 관해 자세히 알아보려면 다음 참고 자료를 참조하세요.

샘플