Singkat

Saya ingin menulis tes unit di JUnit untuk memeriksa aturan air liur individu. Tes unit harus mudah ditulis dan cepat dijalankan. Jika pengujian unit lambat maka pengembang akan menghindari menjalankannya dan pembangunan akan menjadi sangat lambat. Dengan mengingat hal itu, saya mencoba mencari metode terbaik (tercepat untuk dieksekusi dan termudah untuk ditulis) untuk menulis tes unit ini.

Percobaan pertama

Opsi pertama yang saya coba adalah membuat KnowledgeBase sebagai atribut kelas statis dan diinisialisasi pada satu file .drl. Setiap pengujian kemudian membuat sesi baru dalam metode @Before. Ini didasarkan pada contoh kode dalam panduan pengembang aturan Drools JBoss.

Saya telah melihat opsi kedua yang merapikan ini sedikit dengan membuat beberapa anotasi untuk mengabstraksi kode inisialisasi tetapi pada dasarnya pendekatan yang sama.

Saya perhatikan bahwa pengujian unit dasar ini pada satu file .drl membutuhkan waktu beberapa detik untuk dijalankan. Ini tidak terlalu buruk dengan satu unit test tetapi setelah ditingkatkan, saya dapat melihatnya sebagai masalah. Saya melakukan beberapa bacaan dan menemukan bahwa KnowledgeBase mahal untuk dibuat, sedangkan sesinya murah. Inilah sebabnya mengapa contoh memiliki KnowledgeBase sebagai statis sehingga dibuat hanya sekali, namun, dengan beberapa kelas pengujian unit, itu berpotensi dibuat berkali-kali.

Alternatif

Alternatif yang saya coba adalah membuat singleton KnowledgeBase yang akan memuat semua file .drl. Ini akan dilakukan sekali secara global untuk rangkaian pengujian dan kemudian disambungkan secara otomatis ke setiap kelas pengujian. Saya menggunakan kelas @Configuration pegas dan mendefinisikan KnowledgeBase sebagai @Bean. Saya sekarang menemukan bahwa KnowledgeBase membutuhkan waktu 2 detik (tetapi hanya berjalan sekali), pembuatan sesi membutuhkan waktu sekitar 0,2 detik dan pengujian itu sendiri tidak memakan waktu sama sekali.

Sepertinya pendekatan pegas dapat diskalakan lebih baik tetapi saya tidak yakin apakah saya akan mendapatkan masalah lain dengan menguji satu aturan tetapi menggunakan KnowledgeBase yang diinisialisasi pada semua file? Saya menggunakan AgendaFilter untuk menargetkan aturan spesifik yang ingin saya uji. Saya juga telah mencari secara online sedikit dan belum menemukan orang lain yang melakukannya dengan cara ini.

Ringkasan

Apa cara paling terukur untuk menulis tes ini? Terima kasih

2
Ben Thurley 23 November 2017, 14:39

1 menjawab

Jawaban Terbaik

Ini adalah kumpulan pengalaman yang sangat bagus. Biarkan saya menyumbangkan beberapa ide.

Jika Anda memiliki skenario di mana sejumlah besar aturan sangat penting untuk menguji hasilnya karena aturan bersaing satu sama lain, Anda harus membuat KieBase yang berisi semua dan membuat serial, sekali. Untuk tes individu, dapatkan sesi darinya untuk setiap tes, memasukkan fakta dan menembakkan semua aturan, atau, sebagai alternatif, menurunkan sesi di depan, dan menjalankan tes, menghapus sesi (!), menyisipkan fakta dan menembakkan semua aturan.

Untuk menguji satu aturan atau sekumpulan aturan kecil (<10), kompilasi DRL dari awal untuk setiap rangkaian tes mungkin dapat ditoleransi, terutama ketika Anda mengadopsi strategi untuk menggunakan kembali sesi (!) dengan mengosongkan Memori Kerja di antara pengujian individual .

Beberapa pertimbangan juga harus diberikan pada desain aturan. Algoritma berulang yang berlebihan tidak boleh diimplementasikan dalam DRL dengan cara apa pun; menggunakan fungsi DRL atau beberapa metode Java (statis) mungkin jauh lebih unggul. Dan pengujian seperti ini jauh lebih mudah.

Juga, mengikuti pola desain aturan yang sudah ada sangat membantu. Google "Pola Desain dalam Sistem Produksi".

2
laune 23 November 2017, 12:22