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
인터페이스 사용으로 대체된다고 명시되어 있지만 아직 그 어떤 문서에도 사용법이 나와있지 않아 조금 더 확인해본 후에 업데이트 하겠습니다.
'Android > Test' 카테고리의 다른 글
[Android Test] 5) Robolectric Shadows 이해하기 (0) | 2020.03.15 |
---|---|
[Android Test] 3) Robolectric API 와 AndroidX Test API 잘 알고 쓰기 (2) | 2020.03.13 |
[Android Test] 2) Robolectric 설치 및 환경 설정 (0) | 2020.03.12 |
[Android Test] 1) Robolectric 이란? (0) | 2020.03.11 |
[Android UI Test] 6) Espresso 를 활용한 WebView Test (0) | 2020.03.10 |