Mutlidex를 사용할 때 Android Test가 움직이지 않는 문제 및 처리 방법

5280 단어 Android
오랜만입니다.나는 나무집이다.

문제점 발견


나는 AndroidKeyStore를 사용하는데 encrypt 할 수 있는지 없는지decrypt의 테스트를 쓰고 싶다.특히 이 일대가 HW와도 관련이 있기 때문에 나는 모크가 게으름 피우지 않고 실기(또는 시뮬레이터)로 시험을 쓸 생각을 하기 시작했다.encrypt 만든 것decrypt, 원래 텍스트로 쓰는 테스트, 안드로이드 8.시뮬레이터 1개로 작동한 후, 시험 가동이 양호하다.그리고 몇 가지를 수정해서 최종적으로SUCCESS의 문자가 종착역에 도착했다.
항상 그랬으면 좋겠다AndroidKeyStore 주변의 API는 안드로이드 6이다.0부터 큰 변화가 있었기 때문에 minSDK 버전으로 지정된 안드로이드 4입니다.그런데 한번 해 봤는데 문제가 생겼어요.
com.android.builder.testing.ConnectedDevice > No tests found.[Nexus_5X_API_18(AVD) - 4.3.1] FAILED 
No tests found. This usually means that your test classes are not in the form that your test runner expects (e.g. don't inherit from TestCase or lack @Test annotations).
그나저나 AS에서 테스트 파일을 열고 테스트반 왼쪽에 보이는 단일 실행 버튼을 누르면 성공적으로 실행할 수 있겠지...

그때의build.gradle


build.gradle
android {

    defaultConfig {
        :
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    :
}
dependencies {
    :
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
이렇게 되면 적어도 안드로이드 8은 됩니다.1의 시뮬레이터가 잘 돌아가야 한다는 것을 확인했다.

까닭


The issue is that the main dex list for the test APK does not contain the test classes. AndroidJUnitRunner when looking for the test classes, does not uses the patched class loader that contains all dex files, but it only examines classes.dex. Therefore, it does not find any test classes to run.
여기에 적힌 것이 전부인데 덧붙이자면AndroidJUnitRunner 그냥 보기classes.dex, 즉 classesN.dex 등이 무시되는 것이 문제라는 것이다.
muttlidex를ture로 할 때 이런 느낌으로 여러 개의 dex 파일을 만들 수 있습니다.

가장 중요한 시험반을 찾아보면 classes2.dex 안에 있다는 것을 알 수 있다.
AndroidJUnitRunner보지 않고classes2.dex만 본다classes.dex.
그래서No tests found..

해결책


아까와 같은 링크에도workaround라고 쓰여 있습니다.
android.enableD8MainDexList=false
as this will make as keep all annotated classes in the main dex. Even though that is not the required for the legacy multidex to work, it will fix the issue for this particular case.gradle.properties에 기술android.enableD8MainDexList=false을 통해 해결한다.
이것을 기술하면 모조된 클래스를main의 dex 파일에 넣을 수 있다고 합니다.
해봤는데 build.gradle 아래도 필요해요.
build.gradle
dependencies {
  : 
  androidTestImplementation 'com.android.support:multidex-instrumentation:1.0.3'
}
여기까지 하고 드디어 안드로이드 4.그렇지만 시험에 통과했어요.

확인


혹시 모르니까 keep all annotated classes in the main dex 이것도 확인해 보세요.

그렇군요. 확실히 classes.dex에서 테스트반을 발견했습니다.

총결산


멀티텍스에서 androidTest를 이동하고 싶다면 이런 느낌입니다.
build.gradle
android {

    defaultConfig {
        :
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    :
}
dependencies {
    :
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    androidTestImplementation 'com.android.support:multidex-instrumentation:1.0.3'
}
gradle.properties
:
android.enableD8MainDexList=false

좋은 웹페이지 즐겨찾기