🍻

Androidのテストケースでローカルの画像を読み込む方法

2023/08/08に公開

Androidのテストで画像の置き場所がわからず軽くつまった

  • MLKitを利用したクラスのテストケースを書きたくてフォルダ画像を読み込みたかった
  • が、where to locate images for test android kotlin とかで軽くググっても出てこない
  • 最終的にChatGPTにあれこれ聞いて解決できたのでメモ

ChatGPTのログ

ポイント: ビルドシステムが理解できるディレクトリ構造にしないといけない

  • ノリでディレクトリ作ってもダメ
  • 規則がある

理解できるものの例1: リソース

ディレクトリ構造

  • src/androidTest/
    • res/drawable : 画像リソースが入っていると認識されている(コードでも拡張子の指定が不要)
    • res/layout: レイアウト
    • res/values: 文字列
    • この場合、サブフォルダに分けたりはできない(サポートしてないから)

コード例:

// Contextを取得
val appContext: Context = InstrumentationRegistry.getInstrumentation().targetContext

// リソースIDを取得
val resourceId = appContext.resources.getIdentifier("image_20230719145316", "drawable", appContext.packageName)

// bitmapの読み込み
val bitmap: Bitmap = BitmapFactory.decodeResource(appContext.resources, resourceId)

...

例2: assets

ディレクトリ構造

  • src/androidTest/assets/
  • このフォルダはリソースIDが振られないかわりに、path指定で自由にアクセスが可能
    • サブフォルダが自由に作れる
    • テストケースのためならこっちの方がよい
  • src/main/assetsも同様だが、こちらは配布するAPKにも含まれてしまう

コード例:

// Contextを取得
val appContext: Context = InstrumentationRegistry.getInstrumentation().targetContext

// assetsフォルダから画像ファイルをBitmapとして読み込み
val bitmap: Bitmap = appContext.assets.open("images/success/image_20230719145316.jpg").use { inputStream ->
    BitmapFactory.decodeStream(inputStream)
}

ディレクトリ構造例:

src/androidTest/assets/images/success/image_20230719145316.jpg

まとめ

  • assetsフォルダに画像を置けばよい

Discussion