Robolectric(v4.3)의 도입으로 길을 잃은 새끼양을 구하러 왔습니다 [Android/testing]


기사의 초판부터 한 1년이 지났어요.


(특히 관계 설정) 여기가 좋아요.
Android Developers > 문서 > 설명서 > 로컬 단일 테스트 만들기
https://developer.android.com/training/testing/unit-testing/local-unit-tests?hl=ja
의존 관계는 페이지의 첫머리에 쓰여 있으며 실제 코드는 프레임 상관성 포함 정도이다.java.lang.IllegalStateException: No instrumentation registered! 욕을 먹었다면 Android Gradle Plugin을 재검토하세요.
https://stackoverflow.com/questions/53595837/androidx-no-instrumentation-registered-must-run-under-a-registering-instrumen
좋은 테스트 생활👋

이게 뭐야?


Android 테스트 환경Robolectric v4.3 가져오기를 소개하는 글입니다.
Robolectric v4.0 이후 작법이 많이 바뀌었지만 많은 보도가 대응하지 못했다
지금 새로 도입하려면 얼치기 수준의 일본어 일꾼들이 지옥을 볼 것이다
다음 희생자가 나오지 않도록 기사로 쓰기로 했어요.그나저나 지옥을 봤어요.

단계


설정 연결 구성


적혀있는 곳: Robolectric GETTING-STARTED
module-name/build.gradle
android {
  // ほかにも書いてある
    sourceSets {
      // ↓無ければ追記
        test.java.srcDirs += 'src/test/java'
        androidTest.java.srcDirs += 'src/androidTest/java'
    }

    testOptions {
        unitTests {
            includeAndroidResources = true
            returnDefaultValues = true
        }
    }
}

dependencies{
    // ほかにも書いてある
    testImplementation 'androidx.test:core:1.2.0'
    testImplementation 'androidx.test:runner:1.2.0'
    testImplementation 'androidx.test:rules:1.2.0'
    testImplementation 'androidx.test.ext:junit:1.1.1'
    testImplementation 'androidx.test.ext:truth:1.2.0'
    testImplementation 'com.google.truth:truth:0.42'

    testImplementation 'junit:junit:4.12'
    testImplementation 'org.robolectric:robolectric:4.3'
}
gradle.properties
  # androidStudio 3.3以上では不要
  android.enableUnitTestBinaryResources=true
환경의 정비는 여기서 끝난다.간단해!

테스트 설명


수동이든 AndroidStudio든Create Test 가능하기 때문에 테스트 파일을 준비합니다.(test.java.srcDirs 디렉토리!)
여기에 많이 썼지만 참고공식.만으로는 다 쓸 수 없고 매혹적인 곳이다.

테스트 플로

@RunWith(AndroidJUnit4::class)
v4.0을 사용한 후에는androidx를 사용하지 않는 방법이 없을 것 같아서 AndroidJUnit4입니다.
Robolectric으로 자동 전환합니다.

컨텐츠 가져오기

ApplicationProvider.getApplicationContext()
InstrumentationRegistry를 사용하지 않습니다.

활성 시나리오 가져오기

val scenario = launch<CountActivity>(startActivityIntent)

예제


실제 설치에서 살짝 잘라낸 예라 자투리가 되었다
이런 느낌↓의 대화상자라는 인상이다.의외의 문자열 표현.
제목 문자열
[-][+][ 5]
View당 ID는 titleText, buttonMinus, buttonPluscount 입니다.
기능
  • 수치 초읽기
  • Intent를 통해 다음 값 전달
  • 제목 문자열IntentKey.TITLE_TEXT(String)
  • 현재 값IntentKey.COUNT(Int)
  • 최소IntentKey.LOWEST_COUNT(Int)
  • @RunWith(AndroidJUnit4::class)
    @Config(sdk = [Build.VERSION_CODES.O]) // 動作対象バージョンの指定ができます
    class CountActivityTest {
        @Test fun onClickCount() {
            val startActivityIntent = Intent(ApplicationProvider.getApplicationContext(), CountActivity::class.java).also{
                it.putExtra(CountActivity.IntentKey.TITLE_TEXT.name,"TEST_TITLE")
                it.putExtra(CountActivity.IntentKey.COUNT.name, 3)
                it.putExtra(CountActivity.IntentKey.LOWEST_COUNT.name, 0)
            }
    
            val scenario = launch<CountActivity>(startActivityIntent)
            scenario.moveToState(Lifecycle.State.CREATED) // Activityの状態をCreatedにする=onCreate()後の状態
            scenario.onActivity {
                assertNotEquals(it.titleText.text, "ERROR_TITLE")
                assertEquals(it.titleText.text, "TEST_TITLE")
    
                assertEquals(it.count.text, "3")
                assertNotEquals(it.count.text, "2")
                it.buttonMinus.performClick()
                assertEquals(it.count.text, "2")
                it.buttonMinus.performClick()
                it.buttonMinus.performClick()
                assertEquals(it.count.text, "0")
                it.buttonMinus.performClick()
                assertEquals(it.count.text, "0")
    
                it.buttonPlus.performClick()
                assertEquals(it.count.text, "1")
            }
        }
    }
    
    JVM에서 활동과 관련된 테스트가 수행되었습니다.

    알려진 장애 (밟기)


  • java 9 warnings (illegal reflective access operation) #4776
  • 욕을 먹다.

  • Fix remaining usages of ByteBuffer.position(int) #5075
  • 자신이 대상으로 하는 프로젝트에서 응용 프로그램 클래스의 클래스를 계승한 초기화 처리에서 타임즈.자바가 예외를 토했다.
  • Robolectric4.4가 복구되었습니다.
  • 이게 잘못인가요?github 페이지의 맨 밑에 있습니다.
    SNAPSHOT 버전을 사용하는 것이 좋습니다.
    이렇게 고치면 최근에 나온 다음 버전을 기다리세요.4.3의 도입 기사 아닙니까?
  • 끝내다


    v4.4 발표 어려워... (2020.04.23)
    happy testing !

    좋은 웹페이지 즐겨찾기