반응형

Robolectric 은 테스트 환경을 설정할 수 있습니다.
패키지 단위는 robolectric.properties 파일로, 클래스와 메소드 단위는 @Config 어노테이션으로 설정할 수 있습니다.

 

@Config Annotation

하나의 클래스나 메소드 단위에 테스트 환경을 설정하기 위해서는 @Config 어노테이션을 사용합니다. 만약 클래스와 메소드 모두 @Config 를 적용하였다면 겹치는 범위 한에서 메소드 수준의 @Config 가 클래스 수준의 값을 Override 합니다.

 

대표적인 설정 몇 가지만 살펴보도록 하겠습니다. 이외에 다양한 설정 값들을 확인하고 싶다면 docs 를 살펴보면 되겠습니다.

  • sdk - 테스트할 안드로이드 SDK 버전을 설정
  • maxSdk - 다수의 API 버전에서 테스트할 경우 최대 버전을 설정
  • minSdk - 다수의 API 버전에서 테스트할 경우 최소 버전을 설정
  • qualifiers - 테스트할 환경 중 기기에 대한 설정 가능 (참고)
  • application - 테스트에서 사용될 Application 클래스를 지정

이제 이를 활용하여 테스트 환경을 설정하는 몇 가지 예시를 살펴보겠습니다.

 

Configure SDK Version

별도의 설정이 없으면 디폴트 값은 targetSDKVersion 입니다. 만약 다른 SDK 버전에서 테스트하고 싶다면, sdk, minSdk, maxSdk 설정을 통해 변경 해줘야 합니다.

@Config(sdk = { JELLY_BEAN, JELLY_BEAN_MR1 })
public class SandwichTest {

    public void getSandwich_shouldReturnHamSandwich() {
      // will run on JELLY_BEAN and JELLY_BEAN_MR1
    }

    @Config(sdk = KITKAT)
    public void onKitKat_getSandwich_shouldReturnChocolateWaferSandwich() {
      // will run on KITKAT
    }

    @Config(minSdk=LOLLIPOP)
    public void fromLollipopOn_getSandwich_shouldReturnTunaSandwich() {
      // Lollipop 이후 버전부터 targetSDKVersion 까지 테스트
    }
}

 

Configure Application Class

Robolectric 은 디폴트 값으로 AndroidManifest 파일에서 지정된 Application class 를 통해 테스트 합니다. 만약 이를 변경하고 싶다면 custom class 를 정의하여 application 설정을 지정 해주면 됩니다.

@Config(application = CustomApplication.class)
public class SandwichTest {

    @Config(application = CustomApplicationOverride.class)
    public void getSandwich_shouldReturnHamSandwich() {
    }
}

 

Configure Qualifiers

resource qualifiers 를 통해 기기의 언어, 화면 크기, 해상도, 야간 모드, 가로/세로 모드 등 다양한 환경을 설정할 수 있습니다. 각 상황을 직접 설정하는 것이 번거로울 수는 있지만 모든 기기에서 테스트할 수 없는 환경에서는 충분히 가치 있는 작업이라 할 수 있습니다.

 

@Config 를 활용하면 이 작업이 놀랍도록 간단합니다.

 

다음은 기기의 언어는 영어로, 화면은 세로 모드로 설정한 상태에서의 테스트 예시를 작성해 보겠습니다.

 

values/strings.xml

<string name="not_overridden">Not Overridden</string>
<string name="overridden">Unqualified value</string>
<string name="overridden_twice">Unqualified value</string>

 

values-en/strings.xml

<string name="overridden">English qualified value</string>
<string name="overridden_twice">English qualified value</string>

 

values-en-port/strings.xml

<string name="overridden_twice">English portrait qualified value</string>

 

Test

@Test
@Config(qualifiers="en-port")
public void shouldUseEnglishAndPortraitResources() {
  final Context context = RuntimeEnvironment.application;
  assertThat(context.getString(R.id.not_overridden))
                                                .isEqualTo("Not Overridden");
  assertThat(context.getString(R.id.overridden))
                                                .isEqualTo("English qualified value");
  assertThat(context.getString(R.id.overridden_twice))
                                                .isEqualTo("English portrait qualified value");
}

여기서 qualifiers 의 값을 - 이 아닌 + 로 시작하게 될 경우 이는 보다 상위 레벨의 설정값에 append 하게 추가되어 설정됩니다. ( - 는 완전한 대체 )

 

Qualifiers 의 경우 컴파일 타임이 아닌 런타임에서도 적용 가능합니다.

이때는 RuntimeEnvironment.setQualifiers() 메소드를 활용합니다.

@Test @Config(qualifiers = "+port")
public void testOrientationChange() {
  controller = Robolectric.buildActivity(MyActivity.class);
  controller.setup();
  // you can assert that activity is in portrait mode
  RuntimeEnvironment.setQualifiers("+land");
  controller.configurationChange();
  // you can assert that activity is in landscape mode
}

 

robolectric.properties File

지금까지 살펴본 @Config 가 클래스나 메소드에 적용하는 설정이었다면, robolectric.properties 는 좀 더 넓은 범위인 패키지에 환경 설정하는 방법입니다.

 

적용 방법은 간단합니다. 적용하고자 하는 패키지에 robolectric.properties 파일을 만들어 주면 됩니다.

 

일반적으로, 이 파일은 src/test/resources 경로 내에 적절하게 위치 시킵니다. Robolectric 은 top level package 부터 패키지 계층 구조를 순회 하면서 이 properties 파일이 있는지를 탐색합니다.

 

상위 패키지와 하위 패키지의 설정 값이 중복될 경우 보다 좁은 범위의 하위 패키지 설정으로 Override 합니다. 마찬가지로 @Config 를 통해 클래스나 메소드 수준에 설정된 값들은 패키지 수준에 설정된 값보다 더 우선순위를 갖습니다.

 

다은은 robolectric.properties 예시 입니다.

# src/test/resources/com/ready/uitest/robolectric.properties
sdk=18
shadows=my.package.ShadowFoo,my.package.ShadowBar

 

Global Configuration

Robolectric docs 에 나와있는 RobolectricTestRunner 를 상속하여 buildGlobalConfig() 메소드를 재정의 하는 방법은 Robolectric 4.3 버전부터 deprecated 되었습니다.


buildGlobalConfig() 메소드에 주석으로는 GlobalConfigProvider 인터페이스 사용으로 대체된다고 명시되어 있지만 아직 그 어떤 문서에도 사용법이 나와있지 않아 조금 더 확인해본 후에 업데이트 하겠습니다.

 

 

반응형
반응형