Ketika saya pertama kali menemukan tes menulis untuk layanan mikro, yang APInya diterapkan sesuai dengan protokol JSON-RPC, saya menyadari bahwa membangun pemeriksaan kualitas untuk elemen json jauh lebih menuntut daripada yang saya pikirkan sebelumnya.
Berikut ini adalah contoh sederhana.
Tanggapan diterima dari layanan:
{ "result": 12, "id": 46929734, "jsonrpc": "2.0" }
Apa yang perlu Anda periksa:
- Responsnya berisi elemen jsonrpc dan nilainya 2.0
- Respons berisi elemen id dan nilainya sama dengan elemen serupa yang diteruskan dalam permintaan, untuk saat ini katakanlah 46929734
Jawabannya mengandung elemen
"hasil" dan nilainya
12Cara memeriksa ini menggunakan Java + TestNG + Gson:
Assert.assertTrue(response.has("result")); Assert.assertTrue(response.has("jsonrpc")); Assert.assertTrue(response.has("id")); Assert.assertTrue(response.get("result").isJsonPrimitive()); Assert.assertTrue(response.get("jsonrpc").isJsonPrimitive()); Assert.assertTrue(response.get("id").isJsonPrimitive()); Assert.assertEquals(response.get("result").getAsInt(), 12); Assert.assertEquals(response.get("jsonrpc").getAsString(), "2.0"); Assert.assertEquals(response.get("id").getAsInt(), 46929734);
Pada saat ini, pertanyaan "Mengapa ada begitu banyak penegasan?" Dapat mulai terbentuk dalam pikiran. Ya, pada kenyataannya, ketika menguji, Anda hanya tertarik pada kelompok dari tiga pernyataan terakhir, mereka memeriksa nilai json dari elemen-elemen dalam respons dan jika mereka lulus, maka jawabannya memenuhi harapan. Tapi, bagaimana jika tes gagal? Pertimbangkan beberapa alasan yang memungkinkan untuk kejatuhan tes semacam itu:
- Jawab ->
{ "result": 12, "id": 46929734, "jsonrpc": "1.0" }
Kesalahan dari TestNG -> java.lang.AssertionError: diharapkan [2.0] tetapi ditemukan [1.0]
Mereka menunggu "2.0" , mendapat "1.0" - semuanya jelas di sini.
- Jawab ->
{ "result": 12, "id": 46929734, "jsonrpc": {} }
Kesalahan dari TestNG -> java.lang.UnsupportedOperationException: JsonObject
Mereka mencoba mengurai elemen sebagai string, yang benar-benar diterima secara tak terduga dalam respons sebagai objek.
- Jawab ->
{ "result": 12, "id": 46929734 }
Kesalahan dari TestNG -> java.lang.NullPointerException
Kami mencoba mengurai elemen yang tidak ada dalam jawaban sebagai string.
Dengan contoh pertama, semuanya baik-baik saja. Kesalahan dapat dimengerti, nilai aktual dan yang diharapkan segera terlihat. Tetapi contoh kedua dan ketiga tidak dapat menyombongkan hal ini. Penurunan seperti itu membutuhkan waktu penguji untuk menganalisis penyebabnya. Mendebit kesalahan dangkal seperti itu sulit. Diperlukan waktu untuk memahami elemen tertentu yang coba diuraikan parse, metode apa yang dicoba parse, dan bagaimana elemen ini benar-benar terlihat dalam jawabannya. Anda bahkan mungkin harus me-restart tes secara lokal, hanya karena mungkin lebih cepat daripada mengumpulkan semua informasi yang diperlukan dari log rakitan tes.
Sejumlah cek, kebutuhan untuk menulisnya dan mendukungnya dalam keadaan terbaru, membuat saya sangat sedih, jadi saya membuat perpustakaan terpisah di mana saya mengumpulkan semua cek yang diperlukan, menurut pendapat saya, untuk elemen json. Tingkat cakupan dan detail yang sama yang mengharuskan json di atas menggunakan perpustakaan dicapai dalam tiga baris, bukan sembilan.
Gassert.verifyInteger(response, "result", 12); Gassert.verifyString(response, "jsonrpc", "2.0"); Gassert.verifyInteger(response, "id", 46929734);
Perpustakaan menerapkan metode untuk memeriksa:
- elemen dari semua tipe primitif, bersarang dan tidak, dengan nilai memeriksa dan tanpa
- JsonObject, bersarang dan tidak, dengan memeriksa nilai dan tanpa
- JsonArray, bersarang dan tidak, dengan dan tanpa pengecekan nilai
- Elemen JsonNull bersarang dan tidak
- tipe elemen di dalam array
- isi array elemen yang diharapkan
- dimensi array
- dimensi objek
Di semua tingkat verifikasi, kesalahan yang lebih terperinci diterapkan relatif terhadap yang disediakan oleh TestNG secara default.
Pertimbangkan lagi kemungkinan penyebab jatuh pengujian:
- Jawab ->
{ "result": 12, "id": 46929734, "jsonrpc": "1.0" }
Kesalahan dari Gassert -> java.lang.AssertionError: Verifikasi elemen [jsonrpc] gagal. diharapkan [2.0] tetapi ditemukan [1.0]
- Jawab ->
{ "result": 12, "id": 46929734, "jsonrpc": {} }
Kesalahan dari Gassert -> java.lang.AssertionError: Elemen [jsonrpc] bukan JsonPrimitive. tidak berharap menemukan [benar] tetapi menemukan [salah]
- Jawab ->
{ "result": 12, "id": 46929734 }
Kesalahan dari Gassert -> java.lang.AssertionError: Json tidak mengandung elemen: [jsonrpc]. tidak berharap menemukan [benar] tetapi menemukan [salah]
Selain itu, sebagian besar metode untuk pemeriksaan kelebihan beban dengan parameter string tambahan, yang jika jatuh pernyataan akan ditambahkan ke teks kesalahan yang ditampilkan. Fitur ini dapat digunakan, misalnya, untuk menampilkan seluruh respons atau permintaan + respons dalam kesalahan.
Perpustakaan berada di repositori github publik, dan juga ditambahkan ke repositori maven.
MavenGithubAPIDocs