開発PCで、API=29のAVDでテスト成功したので、gitにpushしたところ、Jenkinsサーバからビルド失敗のメールが届きました。Console Outputを見ると、
com.android.builder.testing.ConnectedDevice > No tests found.[305SH - 4.4.4] FAILED
No tests found.
開発PCに、Android 4.4の実機をUSB接続して、テスト実行してみると、確かにテスト失敗しました。API=19のAVDでも、テスト失敗です。
アプリ自体は、Android 4.4でも動きます。
原因は multiDexEnabled
プロジェクトを新規作成して、Empty Activityのアプリを作りました。Android 4.4のAVDや実機で試すと、アプリ自体もandroidTestも動きました。
問題のアプリのapp/build.gradleから1行づつコピーしながら、android 4.4のAVDで、androidTestを実行して、どこで No tests foundになるか調べました。
原因は、multiDexEnabled true でした。
android {
multiDexEnabled true
Code language: JavaScript (javascript)
対応1、android.enableD8MainDexList
"multidexenabled No tests found"で検索して、次の記事が見つかりました。
(1)app/build.gradle に追加
dependencies
androidTestImplementation 'com.android.support:multidex-instrumentation:1.0.3'
Code language: JavaScript (javascript)
(2)gradle.propertiesに追加
android.enableD8MainDexList=false
Code language: JavaScript (javascript)
これらを設定して、gradle syncしたら、次のメッセージが。
WARNING: The following project options are deprecated and have been removed:
android.enableD8MainDexList
This property has no effect, D8 is always used to compute the main dex list.
ターミナルで、androidTestを実行したら、No tests foundのままでした。
対応2、multiDexKeepProguard
さきほどの記事が参照していた記事を見ると、別の対応策が書かれていました。
(1)app/build.gradle
android {
defaultConfig {
multiDexKeepProguard file('multidex.pro')
Code language: JavaScript (javascript)
(2)app/multidex.pro
-keep class Test** { *; }
Code language: JavaScript (javascript)
android 4.4でテストを実行できるようになりましたが、テストクラス29のうち、8クラスしか実行していませんでした。
結論
ソースはもとに戻しました。Jenkinsサーバには、実機のandroid 5.0を接続することにしました。