콘텐츠 제공업체 테스트

데이터를 저장하고 검색하거나 다른 앱에서 데이터에 액세스할 수 있도록 콘텐츠 제공업체를 구현하는 경우 콘텐츠 제공업체를 테스트하여 예상치 못한 방식으로 작동하지 않는지 확인해야 합니다. 이 과정에서는 공개 콘텐츠 제공업체를 테스트하는 방법을 설명하며 이 과정은 자체 앱에 비공개로 유지하는 제공업체에도 적용됩니다.

콘텐츠 제공업체도 참조하세요.

콘텐츠 제공업체의 통합 테스트 만들기

Android에서 앱은 콘텐츠 제공업체를 내부 항목이 뷰에서 숨겨진 데이터 표를 제공하는 데이터 API로 봅니다. 콘텐츠 제공업체에는 많은 공개 상수가 있을 수 있지만 일반적으로 매우 적은 수의 공개 메서드가 있으며 공개 변수는 없습니다. 이러한 이유로 제공업체의 공개 멤버를 기반으로 하는 테스트만 작성해야 합니다. 이와 같이 디자인된 콘텐츠 제공업체는 콘텐츠 제공업체 자체와 사용자 간의 계약을 제공합니다.

콘텐츠 제공업체를 통해 실제 사용자 데이터에 액세스할 수 있으므로 격리된 테스트 환경에서 콘텐츠 제공업체를 테스트해야 합니다. 이 접근 방식을 사용하면 테스트 사례에서 명시적으로 설정된 데이터 종속성에 관해서만 실행할 수 있습니다. 또한 테스트가 실제 사용자 데이터를 수정하지 않는다는 것을 의미하기도 합니다. 예를 들어 이전 테스트에서 남은 데이터가 있으므로 실패한 테스트를 작성하지 않아야 합니다. 마찬가지로 테스트는 제공업체의 실제 연락처 정보를 추가하거나 삭제하지 않아야 합니다.

별도로 콘텐츠 제공업체를 테스트하려면 ProviderTestCase2 클래스를 사용하세요. 이 클래스를 통해 IsolatedContextMockContentResolver 같은 Android 모의 객체 클래스를 사용하여 실제 사용자 데이터에 영향을 미치지 않고 파일과 데이터베이스 정보에 액세스할 수 있습니다.

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

콘텐츠 제공업체의 통합 테스트를 만들려면 다음 단계를 따라야 합니다.

  • 테스트 클래스를 ProviderTestCase2의 서브클래스로 만듭니다.
  • 테스트 클래스 정의의 시작 부분에 @RunWith(AndroidJUnit4::class) 주석을 추가합니다.
  • AndroidX 테스트에서 제공하는 AndroidJUnitRunner 클래스를 기본 테스트 실행기로 지정합니다. 이 단계는 테스트 시작하기에 자세히 설명되어 있습니다.
  • ApplicationProvider 클래스에서 Context 객체를 설정합니다. 아래 스니펫을 예로 참조하세요.

    Kotlin

        @Throws(Exception::class)
        override fun setUp() {
            super.setUp()
            context = ApplicationProvider.getApplicationContext<Context>()
        }
        

    자바

        @Override
        protected void setUp() throws Exception {
            super.setUp();
            setContext(ApplicationProvider.getApplicationContext());
        }
        

ProviderTestCase2 작동 방식

ProviderTestCase2의 서브클래스를 사용하여 제공업체를 테스트합니다. 이 기본 클래스는 AndroidTestCase를 확장하므로 JUnit 테스트 프레임워크와 애플리케이션 권한 테스트를 위한 Android 특정 메서드를 제공합니다. 이 클래스의 가장 중요한 기능은 격리된 테스트 환경을 만드는 초기화입니다.

초기화는 서브클래스가 자체 생성자에서 호출하는 ProviderTestCase2의 생성자에서 실행됩니다. ProviderTestCase2 생성자는 파일 및 데이터베이스 작업을 허용하지만 Android 시스템과의 다른 상호작용을 스터브 처리하는 IsolatedContext 객체를 만듭니다. 파일 및 데이터베이스 작업 자체는 기기 또는 에뮬레이터에 로컬이며 특수한 프리픽스가 있는 디렉터리에서 발생합니다.

그런 다음 생성자가 테스트의 리졸버로 사용할 MockContentResolver를 만듭니다.

마지막으로 생성자는 테스트 중인 제공업체의 인스턴스를 만듭니다. 이 인스턴스는 일반적인 ContentProvider 객체이지만 IsolatedContext에서 모든 환경 정보를 가져오므로 별도의 테스트 환경에서 작동하도록 제한됩니다. 테스트 사례 클래스에서 실행된 모든 테스트는 이 격리된 개체에 관해 실행됩니다.

계측 단위 테스트와 동일한 방식으로 콘텐츠 제공업체의 통합 테스트를 실행합니다. 콘텐츠 제공업체의 통합 테스트를 실행하려면 계측 단위 테스트 실행에 설명된 단계를 따르세요.

테스트 대상

다음은 콘텐츠 제공업체를 테스트하기 위한 구체적인 가이드라인입니다.

  • 리졸버 메서드로 테스트: ProviderTestCase2에서 제공업체 객체를 인스턴스화할 수 있지만 항상 적절한 URI를 사용하여 리졸버 객체로 테스트해야 합니다. 이렇게 하면 일반적인 애플리케이션에서 사용하는 것과 동일한 상호작용을 실행하여 제공업체를 테스트합니다.
  • 공개 제공업체를 계약으로 테스트: 제공업체를 공개하고 다른 애플리케이션에서 사용할 수 있게 하려면 제공업체를 계약으로 테스트해야 합니다. 이와 같이 테스트하는 방법의 예는 다음과 같습니다.
    • 제공업체가 공개적으로 노출하는 상수로 테스트합니다. 예를 들어, 제공업체의 데이터 표 중 하나의 열 이름을 참조하는 상수를 찾습니다. 이러한 상수는 항상 제공업체가 공개적으로 정의한 상수여야 합니다.
    • 제공업체가 제공하는 모든 URI 테스트: 제공업체는 여러 URI를 제공할 수 있으며, 각 URI는 데이터의 다른 측면을 나타냅니다.
    • 잘못된 URI 테스트: 단위 테스트는 의도적으로 잘못된 URI로 제공업체를 호출하고 오류를 찾아야 합니다. 좋은 제공업체 디자인은 잘못된 URI에 IllegalArgumentException을 발생시킵니다.
  • 표준 제공업체 상호작용 테스트: 대부분의 제공업체는 query(), insert(), delete(), update(), getType(), onCreate()라는 6가지 액세스 메서드를 제공합니다. 테스트에서 이러한 모든 메서드가 작동하는지 확인해야 합니다. 이러한 메서드는 콘텐츠 제공업체 주제에 자세히 설명되어 있습니다.
  • 비즈니스 로직 테스트: 콘텐츠 제공업체가 비즈니스 로직을 구현하는 경우 이를 테스트해야 합니다. 비즈니스 로직에는 잘못된 값 처리, 재무 또는 산술 계산, 중복 항목 제거 또는 결합이 포함됩니다.