Pocket

開発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

対応1、android.enableD8MainDexList

"multidexenabled No tests found"で検索して、次の記事が見つかりました。

(1)app/build.gradle に追加

dependencies
    androidTestImplementation 'com.android.support:multidex-instrumentation:1.0.3'

(2)gradle.propertiesに追加

android.enableD8MainDexList=false

これらを設定して、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')

(2)app/multidex.pro

-keep class Test** { *; }

android 4.4でテストを実行できるようになりましたが、テストクラス29のうち、8クラスしか実行していませんでした。

結論

ソースはもとに戻しました。Jenkinsサーバには、実機のandroid 5.0を接続することにしました。