Dalam pengujian unit, bagaimana cara membaca data dari file json di sistem file (desktop) saya, tanpa hardcode jalur?
Saya ingin membaca input pengujian (untuk metode penguraian saya) dari file alih-alih membuat String statis.
File tersebut berada di lokasi yang sama dengan kode pengujian unit saya, tetapi saya juga dapat meletakkannya di tempat lain dalam proyek jika diperlukan. Saya menggunakan Android Studio.
test_documents.json
? direktori aset?Jawaban:
Tergantung
android-gradle-plugin
versinya:1. versi 1.5 dan lebih tinggi:
Letakkan saja file json
src/test/resources/test.json
dan rujuk sebagaiTidak perlu modifikasi gradle.
2. versi di bawah 1.5 : (atau jika karena alasan tertentu solusi di atas tidak berfungsi)
Pastikan Anda menggunakan setidaknya Android Gradle Plugin versi 1.1 . Ikuti link untuk menyiapkan Android Studio dengan benar.
Buat
test
direktori. Letakkan kelas pengujian unit dalamjava
direktori dan letakkan file sumber daya Anda dires
direktori. Android Studio harus menandainya seperti berikut:Buat
gradle
tugas untuk menyalin resource ke direktori kelas agar terlihat untukclassloader
:Sekarang Anda dapat menggunakan metode ini untuk mendapatkan
File
referensi untuk sumber daya file:sumber
src/test/resources/test.json
dan referensikan sebagaiclassLoader.getResource("test.json")
. Tidak perlu modifikasi gradle. Folder bersarang di dalamnyaresources
juga berfungsi.classLoader
? di mana menempatkan baris kode ini? apa yang dapat Anda lakukan dengan hasil pengembalian ?. Harap berikan kode yang lebih lengkap. -1./src/test/resources/file.txt
di Kotlin:TestClassName::class.java.getResource("/file.txt")!!.readText()
Untuk pengujian unit lokal (vs. pengujian instrumentasi), Anda dapat meletakkan file di bawah
src/test/resources
dan membacanya menggunakan classLoader. Misalnya, kode berikut membukamyFile.txt
file di direktori resource.Ini bekerja dengan
sumber
val myFile = ClassLoader.getSystemResource("myFile.txt").readText()
Dalam kasus saya, solusinya adalah menambahkan ke file gradle
Setelah itu semuanya ditemukan oleh AS 2.3.1
sumber
root/app/src/test/resources/test.json
2. membaca data seperti ini:val jsonFile = ClassLoader.getSystemResource("test.json").readText()
Saya mengalami banyak masalah dengan sumber daya pengujian di Android Studio, jadi saya menyiapkan beberapa pengujian untuk kejelasan. Dalam
mobile
proyek (Aplikasi Android) saya, saya menambahkan file berikut:Kelas pengujian (semua pengujian berhasil):
Dalam proyek root yang sama saya memiliki proyek Java (bukan Android) yang disebut
data
. Jika saya menambahkan file yang sama ke proyek data:Maka semua pengujian di atas akan gagal jika saya mengeksekusinya dari Android Studio, tetapi meneruskan pada baris perintah dengan
./gradlew data:test
. Untuk menyiasatinya saya menggunakan hack ini (di Groovy)Pemakaian:
resource('/test.txt')
Android Studio 2.3, Gradle 3.3
sumber
getClassLoader()
versi berfungsi seperti yang diharapkan. Yaitu mereka menemukan file, keduanya dijalankan dari Android Studio DAN dari baris perintah di mesin macOS saya, dan di server Linux CI (CircleCI). Jadi saya akan melakukannya dan berharap Gradle 3.3 tidak merusaknya nanti ...build/resources/test
tidak disertakan dalam jalur kelas interaktif.Jika Anda pergi ke Jalankan -> Edit konfigurasi -> JUnit dan kemudian pilih konfigurasi jalankan untuk pengujian unit Anda, terdapat pengaturan 'Direktori kerja'. Itu harus menunjuk ke mana pun file json Anda. Ingatlah bahwa ini mungkin merusak tes lainnya.
sumber
new File()
atau serupa, tetapi tidak bekerja secara langsung dengan metode pemuatan classpath yang dijelaskan di atas. Ini juga sedikit rumit karena setiap konfigurasi yang baru dijalankan perlu menyetel dir yang berfungsi, dan secara default baris perintah AS dan Gradle suka menggunakan direktori kerja yang berbeda ... sungguh merepotkanSaya pikir saya harus menambahkan temuan saya di sini. Saya tahu ini agak lama tetapi untuk versi Gradle yang lebih baru, di mana TIDAK ada direktori src / test / resources, tetapi hanya satu direktori resource untuk keseluruhan proyek, Anda harus menambahkan baris ini ke file Gradle Anda.
Dengan melakukan ini, Anda dapat mengakses sumber daya Anda dengan:
Saya telah mencari ini dan tidak dapat menemukan jawaban, jadi saya memutuskan untuk membantu orang lain di sini.
sumber
Sebenarnya, inilah yang berhasil untuk saya dengan Uji Instrumentasi (Menjalankan Android Studio versi 3.5.3 , Plugin Android Gradle versi 3.5.3 , Gradle versi 6.0.1 ):
src/androidTest/assets
folderInputStream is = InstrumentationRegistry.getInstrumentation().getContext().getAssets().open("filename.txt");
sumber