
Hampir setahun telah berlalu sejak kesempatan untuk menciptakan keterampilan Anda untuk Alice, asisten suara dari Yandex, muncul. Keterampilan baru tiba setiap hari di katalog , dan jumlah total mereka beberapa ratus. Sayangnya, komunikasi dengan beberapa keterampilan secara halus "tidak bertambah." Keterampilan baik loop pada frasa yang sama atau umumnya rusak dan tidak merespons.
Pada artikel ini, saya akan mempertimbangkan menulis tes otomatis fungsional untuk keterampilan di Node.js. Kehadiran tes semacam itu memungkinkan Anda untuk menciptakan keterampilan yang lebih baik dan memberi kepercayaan pada kinerja mereka.
Alat Pengujian yang Ada
Skill for Alice adalah server web yang dapat menanggapi permintaan POST dalam format tertentu. Saat ini, ada beberapa alat di mana Anda dapat mentransfer URL skill dan memeriksa operasinya:
Keunikan alat ini adalah mereka menawarkan beberapa UI untuk pengujian keterampilan manual. Saya ingin dalam tradisi terbaik integrasi berkelanjutan
jalankan perintah di konsol, secara otomatis memeriksa semua skrip dan hanya kemudian mengunggah versi baru.
Pada saat yang sama, saya tidak ingin mempelajari pengujian unit modul keterampilan individu. Protokol permintaan / respons dicatat dalam dokumentasi , dan pada tingkat ini lebih baik untuk menguji. Kemudian, bahkan setelah sepenuhnya menulis ulang arsitektur internal, Anda tidak perlu mengubah tes. Intinya, ini adalah tes fungsional .
Saya tidak menemukan perpustakaan yang selesai untuk Node.js untuk tugas seperti itu, jadi kami akan menulis sendiri :)
Keterampilan tes
Ambil contoh keterampilan resmi dari repositori Yandex di GitHub. Ini adalah keterampilan "Parrot", yang hanya mengulangi semua yang dikatakan pengguna. Dibangun berdasarkan kerangka mikro dan hanya berisi beberapa baris kode:
Pada panggilan pertama, skill akan menerima pesan kosong dari pengguna (original_utterance) dan menjawab "Hello!"
. Dalam kasus lain, itu hanya menyalin pesan pengguna ke bidang response.text
.
Saya membungkus kode contoh GitHub asli dalam fungsi micro()
sehingga ekspor mengembalikan server http, yang akan kami gunakan dalam pengujian.
Rencana uji
Jadi, untuk mencakup keterampilan seperti itu dengan tes, Anda perlu yang berikut:
- Naikkan server dengan keahlian di port lokal
- Periksa dua kasus:
- Pengguna memasuki skill, skill harus menjawab "Halo!"
- Pengguna mengirim pesan ke skill, skill harus merespons dengan pesan yang sama
- Hentikan server dengan keterampilan dan tampilkan laporan
Dengan mengotomatiskan pemeriksaan ini, Anda dapat menjalankannya sebelum setiap komit dan memastikan tidak ada yang rusak.
Kami akan menulis kode tes sesuai rencana, menggunakan sintaks untuk moka . Misalkan kita sudah memiliki beberapa kelas User
yang dapat melakukan semua yang kita butuhkan:
Masih menulis kelas User
dan dimungkinkan untuk menjalankan tes.
Pengguna virtual
Hal utama yang harus dapat dilakukan oleh pengguna tes adalah mengirim permintaan POST ke url keterampilan dengan data dalam format yang diinginkan. Format permintaan dijelaskan dalam dokumentasi . Sekarang kita tidak perlu semua bidang, jadi saya hanya meninggalkan yang diperlukan agar tidak mengembang kode contoh. Kelas User
dengan komentar:
Luncurkan
Untuk memulai, masih mengimpor kelas pengguna dan server ke file uji, dan juga mengatur nilai port tempat server akan naik:
Instal semua dependensi yang diperlukan:
npm install micro node-fetch mocha
Dan jalankan tes:
$ mocha test.js ✓ should get hello on enter 1 passing (34ms)
Semua baik-baik saja, tes telah berlalu!
Tetapi sebelum melanjutkan, Anda perlu memastikan bahwa tes benar-benar berfungsi. Untuk melakukan ini, ganti keterampilan respons "Halo!" untuk "halo!" dan jalankan lagi:
$ mocha test.js 0 passing (487ms) 1 failing 1) should get hello on enter: AssertionError [ERR_ASSERTION]: '!' == 'Hello!' + expected - actual -! +Hello!
Tes menunjukkan kesalahan - sebagaimana mestinya.
Sekarang, tentu saja, kami menganggap kasus pertama yang akan dibahas.
Kami mengajarkan pengguna untuk berkomunikasi
Kasus kedua tetap ketika pengguna mengirim pesan ke skill dan harus menerima pesan yang sama kembali. Agar pengguna dapat "berkomunikasi", saya menambahkan metode say(message)
ke kelas User
. Saya juga melakukan sedikit refactoring: Saya membuat mengirim permintaan-http ke metode terpisah dan menggunakannya di dalam enter()
dan say(message)
:
Kode uji untuk kasus kedua terlihat seperti ini:
it('should reply the same message', async () => {
Kami mulai lagi, dan kami melihat bahwa kedua tes telah lulus:
$ mocha test.js ✓ should get hello on enter ✓ should reply the same message 2 passing (37ms)
Langkah selanjutnya
Dengan cara yang sama, Anda bisa menambahkan skrip yang lebih kompleks ke dalam ketrampilan, yang meliputi dengan tes. Ini akan memastikan bahwa perubahan baru tidak rusak lama.
Infrastruktur pengujian yang dibuat juga dapat ditingkatkan:
- modifikasi kelas
User
sehingga bidang yang tersisa dalam permintaan dapat diubah (misalnya, centang kotak bahwa pengguna tidak memiliki layar) - menghubungkan cakupan kode (mis. nyc )
- menggantung semua cek pada kait pre-commit / pre-push (mis. menggunakan husky )
Saya memiliki beberapa keterampilan, jadi saya menempatkan kelas pengguna tes dalam paket alice-tester yang terpisah, mungkin seseorang akan berguna.
Saya juga memposting kode contoh lengkap dari artikel di GitHub . Anda dapat mengkloning repositori dan bereksperimen.
Terima kasih atas perhatian anda!