🍻
Androidのテストケースでローカルの画像を読み込む方法
Android のテストで画像の置き場所がわからず軽くつまった
- MLKit を利用したクラスのテストケースを書きたくてフォルダ画像を読み込みたかった
- が、
where to locate images for test android kotlinとかで軽くググっても出てこない- Android Studio unit testing: read data (input) file - Stack Overflow
- これとか。そもそも回答がカオスな状況かつ、その場しのぎな解決策が多い
- 最終的に 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