🍻
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