Pengembangan Layanan Mikro dengan BDD dan IOD

BDD - pengembangan melalui perilaku. BDD untuk layanan mikro adalah kolaborasi dari klien, pengembang, dan penguji. BDD adalah pengembangan yang memperhitungkan kepentingan teknis dan persyaratan bisnis. Pendekatan ini biasanya digunakan untuk menggambarkan antarmuka aplikasi, dan karena microservices adalah detail dari implementasi sistem, BDD juga cocok untuk mengembangkan microservices. Bagaimana melakukannya - dalam terjemahan Ken Pugh.

gambar

Tentang Pengarang: Ken Pugh mengajarkan perusahaan untuk mengembangkan fleksibilitas, menciptakan sistem berkualitas tinggi menggunakan Acceptance Test-Driven Development, BDD, akselerasi DevOps. Ken telah menulis beberapa buku tentang pengembangan perangkat lunak, adalah pemenang Prefaktoring Jolt Award 2006, salah satu pencipta kursus Rekayasa Perangkat Lunak Agile SAFe.

Perilaku dalam BDD sering diungkapkan oleh konstruksi Given / When / Then. Kita diberikan keadaan tertentu ketika suatu tindakan atau peristiwa terjadi, maka keadaan tersebut berubah dan / atau informasi dikembalikan.

Misalnya, logika kewarganegaraan, seperti aturan dan perhitungan bisnis, cukup menjelaskan konversi input ke output.

Desain Berorientasi Antarmuka menggunakan prinsip "desain untuk antarmuka, bukan implementasi . " Konsumen layanan menggunakan antarmuka yang disediakannya, bukan internal. Ini berarti bahwa antarmuka seperti itu harus dipikirkan dengan jelas, termasuk perilaku kesalahan. Untuk definisi istilah dalam deskripsi antarmuka atau perilakunya, dimungkinkan untuk menggunakan DDD - Domain Driven Design.

Layanan microsoft dapat sinkron ketika konsumen secara langsung memanggil layanan lain dan mengharapkan hasilnya, atau asinkron ketika layanan menjawab pesan bahwa klien telah menempatkan dalam antrian .

Pertimbangkan contoh layanan sinkron.

Layanan sinkron


Bayangkan sebuah layanan yang menghitung diskon pesanan penjualan. Seluruh proses adalah serangkaian operasi terkait.



Perilaku layanan ini dapat digambarkan sebagai berikut:

Get discount for a customer Given these inputs Customer category Order Amount Then service outputs Discount Amount 

Layanan dapat menghitung diskon menggunakan algoritma dalam kode, berdasarkan pada basis data data lokal atau dengan menghubungi layanan lain.

Itu dapat menggunakan JSON atau XML sebagai format pesan. Namun, mendeskripsikan layanan tanpa menentukan detail implementasi membantu memisahkan semantik operasi dari sintaks.

Apa perilakunya?


Dengan menggunakan BDD, Anda dapat mulai mendesain dengan data sampel untuk mendapatkan gambaran tentang perilaku yang diinginkan. Pengembang layanan, klien, dan penguji dapat memberikan contoh ini. Dua kolom pertama adalah input ke layanan, dan kolom di sebelah kanan adalah output.

Kategori pelanggan
Jumlah pesanan
Jumlah diskon?
Bagus
100,00 USD
1,00 USD
Luar biasa
100,00 USD
2,00 USD

Contoh ini menunjukkan istilah domain yang mungkin memerlukan penyempurnaan lebih lanjut - misalnya, uraikan nilai yang valid.



Dipahami bahwa layanan mengembalikan hasil yang benar jika data input masuk dalam kisaran nilai yang dapat diterima.

Deskripsi perilaku, terutama untuk layanan-layanan mikro, sering menyertakan respons jika terjadi kegagalan dan kesalahan. Deskripsi potensi kegagalan membantu konsumen memahami apa yang harus dilakukan dalam kasus-kasus tersebut. Pelanggan layanan dapat menggunakan perpustakaan khusus, misalnya, Hystrix dari Netflix, untuk memperbaiki beberapa kegagalan ini.

Beberapa potensi kesalahan layanan kami:

Kecelakaan
Sintaks kueri tidak valid
Batas Waktu Panggilan Layanan yang Tergantung
Nilai parameter permintaan tidak valid

Kegagalan dapat dinyatakan sebagai konstanta numerik atau karakter dalam protokol komunikasi.

Menggunakan nama-nama yang bermakna dalam BDD membantu menekankan semantik kegagalan, bukan sintaksisnya.

Jika nilai yang diberikan sebagai kategori tidak ada dalam daftar nilai yang dapat diterima, maka layanan akan mengembalikan indikator kegagalan: "Nilai parameter kueri tidak valid." Ini dapat diwakili, misalnya, dengan mengembalikan kode HTTP 400 dan deskripsi teks yang sesuai.

Atau, Anda dapat menentukan nilai diskon yang akan dikembalikan, misalnya 0 jika salah satu parameter salah. Dalam hal ini, layanan harus bertanggung jawab untuk merekam masalah ini sehingga konsekuensinya dapat dianalisis.

Layanan BDD test dapat membentuk konteks untuk tes unitnya. Dalam proses desain, tanggung jawab untuk lulus tes BDD terletak pada kelas dan metode . Tes unit menentukan tanggung jawab ini.

Rintisan bertopik


Saat menguji suatu layanan, bertopik layanan yang bergantung yang sering diminta. Mereka sangat dibutuhkan untuk layanan yang lambat, mahal atau acak. Jika perilaku layanan diskon tidak pernah berubah, maka saat menguji klien, Anda dapat menggunakan instance pertempuran.

Perubahan sering kali tidak terhindarkan, sehingga bertopik biasanya diperlukan.



Stub selalu dapat mengembalikan nilai yang sama, misalnya:

Kategori pelanggan
Jumlah pesanan
Jumlah diskon?
Bagus
100,00 USD
1,00 USD
Luar biasa
100,00 USD
2,00 USD

Tes pelanggan dapat mengandalkan nilai-nilai ini. Dalam contoh ini, perilaku konstan mungkin cukup. Untuk pengujian lain, respons rintisan khusus lebih disukai.

Atau, potongan layanan diskon hanya dapat mengembalikan jumlah yang sama, terlepas dari input.

Bagaimana rintisan ini dapat masuk ke dalam skenario yang lebih luas? Pertimbangkan perilaku sistem untuk pesanan, yang mencakup diskon dan pajak. Pajak dihitung oleh layanan mikro, mirip dengan diskon.



Ada pembeli.

Kategori Pembeli
Lokasi
Bagus
Carolina utara

Diskon yang bisa disesuaikan.

Kategori Pelanggan
Jumlah pesanan
Jumlah Diskon?
Bagus
100,00 USD
1,00 USD

Pajak itu ditetapkan.

Lokasi
Jumlah
Pajak?
Carolina utara
99,00 USD
6.60 USD

Ketika seorang pelanggan melakukan pemesanan:

Jumlah pesanan
100,00 USD

Kemudian opsi pemesanan.

Jumlah pesanan
diskon
Jumlah setelah diskon
pajak
Total hutang
100 USD
1,00 USD
99,00 USD
6.60 USD
105,60 USD

Layanan dengan negara


Jika layanan diskon menggunakan database untuk mendapatkan informasi untuk menghitung diskon, maka isinya adalah kondisi layanan. Perubahan status dalam menanggapi pembaruan data harus didokumentasikan. Misalkan layanan memiliki keadaan ini.

Kategori pelanggan
Tingkat ambang batas
Persentase diskon
Bagus
100,00 USD
1%
Luar biasa
50,00 USD
2%

Dalam hal ini, layanan harus memungkinkan pengubahan data ini. Pembaruan dapat diatur sehingga setiap elemen diperbarui atau seluruh tabel diperbarui segera. Berikut adalah contoh tes perilaku untuk pembaruan individu.

Diberikan data saat ini.

Kategori pelanggan
Tingkat ambang batas
Persentase diskon
Bagus
100,00 USD
1%
Luar biasa
50,00 USD
2%

Ketika suatu item diperbarui.

Kategori pelanggan
Tingkat ambang batas
Persentase diskon
Luar biasa
50,00 USD
3,5%

Kemudian data diperbarui.

Kategori pelanggan
Tingkat ambang batas
Persentase diskon
Bagus
100,00 USD
1%
Luar biasa
50,00 USD
3,5%

Anda juga dapat memverifikasi bahwa data yang diperbarui digunakan untuk menghitung diskon.

Kategori pelanggan
Tingkat ambang batas
Jumlah diskon?
Luar biasa
100,00 USD
3,50 USD

Layanan diskon mungkin memiliki penyimpanan lokal untuk menyimpan data dalam contoh ini, tetapi mungkin juga bergantung pada layanan penyimpanan terpisah untuk data ini. Jika demikian, maka pengujian dari bagian sebelumnya berlaku untuk layanan terpisah. Tetapi setiap kecanduan menambah masalah. Apa yang seharusnya menjadi perilaku layanan jika dependensinya tidak tersedia? Untuk layanan diskon, apakah ini mengindikasikan kegagalan atau haruskah hanya mengembalikan nilai default, 0 yang sama? Terkadang Anda dapat menggunakan kebijakan penanganan kesalahan global, tetapi seringkali keputusan tergantung pada konteks layanan .

Formulasi dan Otomatisasi Tes


Setelah perilaku layanan mikro konsisten, itu dapat dirumuskan sebagai tes otomatis. Ada beberapa sistem pengujian microservice, seperti PACT atau Karate. Selain itu, Anda dapat menggunakan kerangka kerja BDD seperti Mentimun atau FIT.

Misalnya, Mentimun menggunakan perpustakaan untuk meminta layanan. Maka informasi tambahan tentang lingkungan dapat disajikan sebagai bagian dari naskah.

Misalnya, file objek Ketimun mungkin termasuk.

Skenario: Hitung diskon untuk jumlah pesanan
Pengaturan yang diberikan adalah:
| URL | myrestservice.com |
Ketika diskon dihitung dengan:
| Metode | DAPATKAN |
| Path | diskon |
| Versi | 1 |
Maka hasil untuk setiap contoh adalah:
| Kategori Pelanggan | Jumlah Pesanan | Jumlah Diskon? |
| Bagus | 100,00 USD | 1,00 USD |
| Luar Biasa | 100,00 USD | 2,00 USD |

Opsi langkah tergantung pada konvensi pengujian Anda.

Nilai dalam dua kolom pertama dapat ditransfer ke konvensi pemanggilan, misalnya, ke parameter kueri. Hasil dalam body harus cocok dengan kolom ketiga. Jika nama dan nilai kueri adalah nama dan nilai kolom, ini mengurangi perbedaan antara tes dan implementasi.

Untuk digunakan kembali, langkah-langkah dapat ditulis untuk layanan sewenang-wenang yang melakukan perhitungan atau menentukan hasil dari aturan bisnis. Dalam contoh di atas, menggunakan Simbol "?", Seperti pada "Jumlah Diskon" di atas, membantu penganalisa membedakan antara input dan output.

Tes juga harus mencakup kegagalan, misalnya.

Kategori PelangganJumlah Pesanan & nbspJumlah Diskon? & NbspHasil
Bagus & nbsp100,00 USD & nbsp
1,00 USD & nbsp
Ok
Tidak Begitu Baik & nbsp100,00 USD & nbsp2,00 USD & nbspNilai parameter tidak valid
Luar biasa & nbsp100,00 ZZZ & nbsp2,00 USD & nbspNilai parameter tidak valid

Kesimpulan


Layanan Microsoft bergantung pada layanan dan sistem lain, yang membutuhkan spesifikasi antarmuka yang jelas dan pengujian yang akurat. Ini dapat dicapai dengan menggambarkan perilaku dan antarmuka yang ditentukan oleh tes. Menggunakan BDD, fungsionalitas layanan dijelaskan oleh tes yang dapat dieksekusi yang berfokus pada semantik operasi, daripada sintaksis . Otomatisasi tes semacam itu biasanya membutuhkan pengaturan bertopik layanan lain, perilaku yang dijelaskan oleh tes BDD masing-masing.

Desain berorientasi antarmuka - IOD, mencakup kewajiban tambahan layanan: pembatasan penggunaan sumber daya, bandwidth, dan pelaporan kesalahan. Bersama-sama, BDD dan IOD membantu menggambarkan perilaku layanan sehingga pelanggan dapat dengan mudah memahami dan mengandalkannya.

  • BDD untuk layanan-layanan mikro berfokus pada kerja sama triad - pengembang layanan, pengembang klien, dan penguji.
  • Buat konvensi yang jelas untuk antarmuka microservice menggunakan IOD.
  • Layanan microser biasanya memerlukan colokan uji untuk mempercepat pengujian.
  • Tes harus independen.
  • Uji skenario negatif dalam tes.
Pada 27-28 Mei, selama festival RIT ++ , di konferensi QualityConf, Artyom Malyshev akan berbicara tentang pentingnya mengekspresikan model domain dengan jelas dalam kode dan menunjukkan bagaimana melakukan ini menggunakan contoh.

Ayo bicara tentang pengembangan produk berkualitas dan bagikan ide-ide Anda!

Source: https://habr.com/ru/post/id450800/


All Articles