Awal artikel: menulis JRTB-3 . Sekarang kita perlu memikirkan tentang pengujian. Semua kode yang ditambahkan harus diuji sehingga kami dapat yakin bahwa fungsinya berfungsi seperti yang kami harapkan. Pertama kita akan menulis pengujian unit untuk layanan SendBotMessageService.
Pengujian unit adalah pengujian yang menguji logika beberapa bagian kecil aplikasi: biasanya ini adalah metode. Dan semua sambungan yang mempunyai cara ini diganti dengan yang palsu dengan menggunakan tiruan.
Sekarang Anda akan melihat semuanya. Dalam paket yang sama, hanya di folder ./src/test/java kita membuat kelas dengan nama yang sama dengan kelas yang akan kita uji, dan menambahkan Test di akhir . Artinya, untuk SendBotMessageService kita akan memiliki SendBotMessageServiceTest , yang akan berisi semua pengujian untuk kelas ini. Ide dalam pengujiannya adalah sebagai berikut: kita menyelipkan JavaRushTelegarmBot tiruan (palsu), yang kemudian kita tanyakan apakah metode eksekusi dipanggil dengan argumen seperti itu atau tidak. Inilah yang terjadi:
Menggunakan Mockito, saya membuat objek tiruan JavaRushBot, yang saya teruskan ke konstruktor layanan kami. Selanjutnya, saya menulis satu tes (setiap metode dengan anotasi Test adalah tes terpisah). Struktur metode ini selalu sama - tidak memerlukan argumen dan mengembalikan batal. Nama pengujian seharusnya memberi tahu Anda apa yang sedang kami uji. Dalam kasus kami, ini adalah: harus mengirim pesan dengan benar - harus mengirim pesan dengan benar. Pengujian kami dibagi menjadi tiga bagian:
blok //diberikan - tempat kami mempersiapkan semua yang diperlukan untuk ujian;
blok //kapan - tempat kita meluncurkan metode yang ingin kita uji;
//lalu blokir - tempat kita memeriksa apakah metode tersebut bekerja dengan benar.
Karena logika dalam layanan kami sejauh ini sederhana, satu tes untuk kelas ini sudah cukup. Sekarang mari kita menulis tes untuk CommandContainer:
Ini bukanlah ujian yang jelas. Itu bergantung pada logika wadah. Semua perintah yang didukung bot ada di daftar CommandName dan harus ada di dalam container. Jadi saya mengambil semua variabel CommandName, pergi ke Stream API dan untuk masing-masing variabel saya mencari perintah dari wadah. Jika tidak ada perintah seperti itu, UnknownCommand akan dikembalikan. Inilah yang kami periksa di baris ini:
Dan untuk memeriksa apakah UnknownCommand akan menjadi default, Anda memerlukan tes terpisah - mustReturnUnknownCommand . Saya menyarankan Anda untuk menulis ulang dan menganalisis tes ini. Saat ini akan ada tes semi-formal untuk tim, tetapi tes tersebut perlu dilakukan secara tertulis. Logikanya akan sama dengan pengujian SendBotMessageService, jadi saya akan memindahkan logika pengujian umum ke kelas abstractCommandTest, dan setiap kelas pengujian tertentu akan diwarisi dan menentukan bidang yang dibutuhkannya. Karena semua tes memiliki tipe yang sama, menulis hal yang sama setiap saat tidaklah mudah, ditambah lagi ini bukan pertanda kode yang baik. Beginilah hasil kelas abstrak umum:
Seperti yang Anda lihat, kami memiliki tiga metode abstrak, setelah menentukan masing-masing perintah harus menjalankan tes yang ditulis di sini dan dijalankan dengan benar. Ini adalah pendekatan yang mudah digunakan ketika logika utama ada di kelas abstrak, tetapi detailnya ditentukan di kelas turunannya. Dan inilah sebenarnya implementasi tes khusus:
BantuanPerintahTes:
packagecom.github.javarushcommunity.jrtb.command;importorg.junit.jupiter.api.DisplayName;importstaticcom.github.javarushcommunity.jrtb.command.CommandName.HELP;importstaticcom.github.javarushcommunity.jrtb.command.HelpCommand.HELP_MESSAGE;@DisplayName("Unit-level testing for HelpCommand")publicclassHelpCommandTestextendsAbstractCommandTest{@OverrideStringgetCommandName(){return HELP.getCommandName();}@OverrideStringgetCommandMessage(){return HELP_MESSAGE;}@OverrideCommandgetCommand(){returnnewHelpCommand(sendBotMessageService);}}
Tanpa Tes Perintah:
packagecom.github.javarushcommunity.jrtb.command;importorg.junit.jupiter.api.DisplayName;importstaticcom.github.javarushcommunity.jrtb.command.CommandName.NO;importstaticcom.github.javarushcommunity.jrtb.command.NoCommand.NO_MESSAGE;@DisplayName("Unit-level testing for NoCommand")publicclassNoCommandTestextendsAbstractCommandTest{@OverrideStringgetCommandName(){return NO.getCommandName();}@OverrideStringgetCommandMessage(){return NO_MESSAGE;}@OverrideCommandgetCommand(){returnnewNoCommand(sendBotMessageService);}}
Mulai Tes Perintah:
packagecom.github.javarushcommunity.jrtb.command;importorg.junit.jupiter.api.DisplayName;importstaticcom.github.javarushcommunity.jrtb.command.CommandName.START;importstaticcom.github.javarushcommunity.jrtb.command.StartCommand.START_MESSAGE;@DisplayName("Unit-level testing for StartCommand")classStartCommandTestextendsAbstractCommandTest{@OverrideStringgetCommandName(){return START.getCommandName();}@OverrideStringgetCommandMessage(){return START_MESSAGE;}@OverrideCommandgetCommand(){returnnewStartCommand(sendBotMessageService);}}
Hentikan Tes Perintah:
packagecom.github.javarushcommunity.jrtb.command;importorg.junit.jupiter.api.DisplayName;importstaticcom.github.javarushcommunity.jrtb.command.CommandName.STOP;importstaticcom.github.javarushcommunity.jrtb.command.StopCommand.STOP_MESSAGE;@DisplayName("Unit-level testing for StopCommand")publicclassStopCommandTestextendsAbstractCommandTest{@OverrideStringgetCommandName(){return STOP.getCommandName();}@OverrideStringgetCommandMessage(){return STOP_MESSAGE;}@OverrideCommandgetCommand(){returnnewStopCommand(sendBotMessageService);}}
Tes Perintah Tidak Diketahui:
packagecom.github.javarushcommunity.jrtb.command;importorg.junit.jupiter.api.DisplayName;importstaticcom.github.javarushcommunity.jrtb.command.UnknownCommand.UNKNOWN_MESSAGE;@DisplayName("Unit-level testing for UnknownCommand")publicclassUnknownCommandTestextendsAbstractCommandTest{@OverrideStringgetCommandName(){return"/fdgdfgdfgdbd";}@OverrideStringgetCommandMessage(){return UNKNOWN_MESSAGE;}@OverrideCommandgetCommand(){returnnewUnknownCommand(sendBotMessageService);}}
Jelas bahwa game ini sepadan dengan usahanya, dan berkat abstractCommandTest kami mendapatkan tes yang sederhana dan mudah dipahami, serta mudah ditulis dan dipahami. Selain itu, kami menghilangkan duplikasi kode yang tidak perlu (halo prinsip KERING -> Jangan Ulangi Diri Sendiri). Selain itu, sekarang kami memiliki tes nyata yang dapat digunakan untuk menilai kinerja aplikasi. Akan menyenangkan juga untuk menulis tes untuk bot itu sendiri, tetapi semuanya tidak akan berjalan dengan mudah dan secara umum, mungkin permainannya tidak sepadan, seperti yang mereka katakan. Oleh karena itu, pada tahap ini kami akan menyelesaikan tugas kami. Hal terakhir dan favorit - kita membuat komit, menulis pesan: JRTB-3: menambahkan Pola perintah untuk menangani perintah Bot Telegram Dan seperti biasa - Github sudah mengetahui dan menawarkan untuk membuat permintaan tarik: Pembangunan telah berlalu dan Anda sudah bisa bergabung... Tapi tidak! Saya lupa memperbarui versi proyek dan menulisnya di RELEASE_NOTES. Kami menambahkan entri dengan versi baru - 0.2.0-SNAPSHOT: Kami memperbarui versi ini di pom.xml dan membuat komit baru: Komit baru: JRTB-3: diperbarui RELEASE_NOTES.md Sekarang dorong dan tunggu hingga pembangunan selesai. Pembangunan telah berlalu, Anda dapat menggabungkannya: Saya tidak menghapus cabangnya, sehingga Anda selalu dapat melihat dan membandingkan apa yang telah berubah. Papan tugas kami telah diperbarui:
kesimpulan
Hari ini kami melakukan hal besar: kami memperkenalkan template Command untuk bekerja. Semuanya sudah diatur, dan sekarang menambahkan tim baru akan menjadi proses yang sederhana dan mudah. Kami juga berbicara tentang pengujian hari ini. Kami bahkan bermain sedikit dengan tidak mengulangi kode dalam pengujian berbeda untuk tim. Seperti biasa, saya menyarankan untuk mendaftar di GitHub dan mengikuti akun saya untuk mengikuti seri ini dan proyek lain yang saya kerjakan di sana. Saya juga membuat saluran telegram di mana saya akan menduplikasi rilis artikel baru. Satu hal yang menarik adalah kode tersebut biasanya dirilis seminggu sebelum artikel itu sendiri, dan di saluran tersebut saya akan menulis setiap kali tugas baru diselesaikan, yang akan memberi saya kesempatan untuk mengetahui kode tersebut sebelum membaca artikel. Segera saya akan mempublikasikan bot tersebut secara berkelanjutan, dan mereka yang berlangganan saluran telegram akan menjadi orang pertama yang mengetahuinya ;) Terima kasih semuanya telah membaca, untuk dilanjutkan.
GO TO FULL VERSION