Apa yang harus diuji dalam Javascript?

12

Di tempat kerja, kami baru saja memulai aplikasi berbasis Javascript (sebenarnya menggunakan Coffeescript, tetapi masih), yang mana saya telah menerapkan sistem pengujian otomatis menggunakan JsTestDriver dan fabric.

Kami belum pernah menulis sesuatu dengan Javascript sebanyak ini, jadi sampai sekarang kami belum pernah melakukan pengujian Javascript. Saya tidak yakin apa tepatnya yang harus kami uji dalam unit test kami. Kami telah menulis plugin JQuery untuk berbagai hal, jadi cukup jelas bahwa mereka harus diverifikasi kebenarannya sebanyak mungkin dengan JsTestDriver, tetapi semua orang di tim saya tampaknya berpikir bahwa kami juga harus menguji Javascript tingkat halaman.

Saya tidak berpikir kita harus menguji Javascript tingkat halaman sebagai unit test, melainkan menggunakan sistem seperti Selenium untuk memverifikasi semuanya berfungsi seperti yang diharapkan. Alasan utama saya untuk ini adalah bahwa saat ini, tes Javascript tingkat halaman dijamin gagal melalui JsTestDriver, karena mereka mencoba mengakses elemen pada DOM yang tidak mungkin ada.

Jadi, apa yang harus diuji unit dalam Javascript?

Nathan Hoad
sumber
3
Anda mengisolasi kode javascript yang telah Anda tulis ke dalam modul. Kemudian Anda cukup menguji input dan output dari modul-modul tersebut. Setiap modul yang berhubungan dengan DOM berarti Anda harus menguji DOM. Gunakan alat yang lebih baik daripada jsTestDriver.
Raynos
Anda harus unit logika bisnis pengujian. Jika logika dan elemen bisnis Anda pada DOM saling terkait maka Anda memiliki cacat desain. Abstraksi keluar sebanyak mungkin logika bisnis dari elemen laman sehingga dapat diuji unit dengan benar. Untuk verifikasi interaksi elemen DOM Anda harus menggunakan Selenium.
maple_shaft
1
@NathanHoad Anda menulis unit test yang dijalankan di browser itu sendiri, nodeunit, qunit dan melati adalah alat yang masuk akal. Saat berjalan di browser Anda memiliki DOM. Anda dapat menggunakan alat seperti pengujian untuk mengotomatiskan pengujian browser.
Raynos
1
Terima kasih. Saya melihat ke arah jsTestDriver karena diklaim dapat berjalan di browser, yang, meskipun secara teknis benar, saya menemukan tidak sama dengan berjalan dengan QUnit. Saya sedang mengerjakan alat saya sendiri saat ini yang menggunakan QUnit, dengan panel bilah alat debug Django khusus. Menggunakan Selenium, saya dapat mendeteksi tes yang gagal. Juga, saya ragu bos saya akan membayar untuk pengujian, meskipun itu terlihat cukup bagus!
Nathan Hoad

Jawaban:

4

Uji semua yang Anda bisa.

Logika murni dapat diuji dengan mudah.

Jika kode Anda berinteraksi dengan DOM atau jaringan, itu jauh lebih sulit.

Jika Anda bisa mengabstraksi sepotong kode untuk bekerja pada elemen DOM acak alih-alih yang spesifik, maka Anda dapat mengujinya lebih mudah. (Buat elemen untuk bekerja pada parameter).

Kode yang menggunakan Ajax dapat diuji dengan hanya memanggil fungsi panggilan balik dengan data tetap. Saya telah menjalani beberapa tes di mana saya menimpa $.ajaxdengan fungsi saya sendiri. Pastikan Anda mengembalikan yang asli saat selesai!

Apa yang akan Anda temukan adalah bahwa "javascript tingkat halaman" benar-benar berarti, "kode yang digabungkan secara ketat," dan jika Anda memisahkan bagian-bagian dari kode tersebut, Anda dapat mengujinya secara independen.

(Selenium bukan alat pengujian unit. Ini bagus untuk skenario tingkat tinggi, tetapi Anda tidak dapat menguji drive dengan itu, dan itu tidak bekerja di lingkungan yang terisolasi.)

Sean McMillan
sumber
Jasmine dapat mengejek panggilan fungsi dan data respons, Anda mungkin melihat ke dalam itu alih-alih fungsi mengesampingkan.
Steve
Saya harus mengklarifikasi - kami memiliki fungsi dan semacamnya di setiap halaman. Saya berbicara lebih banyak tentang pengujian kode yang dijalankan di dalamnya $(document).ready(...).
Nathan Hoad
1
Itu semua masalah seberapa besar itu .... :-) Saya merasa Anda harus bisa mendapatkan ke fungsi bernama tunggal yang juga diuji. Maka kode Anda yang belum diuji adalah satu baris. (Nah, itu gol, bukan yang diberikan. Dalam praktiknya, saya selalu punya lebih dari satu baris kode yang belum diuji.)
Sean McMillan
@SeanMcMillan - Saya merasa sangat sulit untuk menguji bagian dari aplikasi yang hanya mempengaruhi DOM, misalnya, fungsi yang hanya mengikat beberapa peristiwa ke beberapa elemen DOM. Bagaimana Anda memeriksa bahwa peristiwa-peristiwa itu ditulis dengan benar? bukan sesuatu yang bisa dilakukan oleh unit test, tetapi mengklik dan memeriksa browser nyata (menggunakan selenium atau apa pun)
vsync
@vsync: Anda dapat menguji itu, katakanlah, pengendali klik dilampirkan ke elemen DOM yang diberikan dengan cukup mudah. Saya rasa tidak mungkin untuk menguji bahwa 'klik' adalah penangan yang tepat, dan bahwa Anda telah melampirkannya ke elemen yang tepat.
Sean McMillan
5

Algoritma uji. Bagian yang berhubungan erat dengan GUI lebih tergantung pada browser tertentu sehingga harus diuji menggunakan utilitas mirip selenium.

Kode Anda, tentu saja, harus mengandung algoritma sebagai potongan kode yang terisolasi, jika tidak maka pengujian unit hampir mustahil.

plugin jquery, btw, tidak mudah diuji unit.

Sergey Stolyarov
sumber
Semua poin bagus! Saya setuju bahwa mereka tidak mudah diuji unit juga, tergantung pada bagaimana mereka ditulis.
Nathan Hoad
-1

Saya dulu bekerja dengan Java dan dari apa yang saya lihat pengujian unit Java lebih mudah daripada pengujian unit JavaScript karena Java lebih kaku.

Saya dijual pada pengembangan yang digerakkan oleh tes adalah hal terbaik jadi saya juga mencari cara untuk menguji unit JavaScript. Di Jawa saya telah membuat kode yang membuat koneksi ke database, Objek Akses Data, dan saya membandingkannya dengan kode dalam JavaScript yang mengubah DOM dan kode yang membuat panggilan AJAX ke server.

Yang saya maksudkan adalah bahwa menurut saya apa yang harus diuji adalah logika secara eksplisit. Misalnya, Anda tidak ingin membuat panggilan AJAX ketika Anda menjalankan tes unit karena (a) Anda memerlukan server untuk menjalankan dan (b) lambat dan salah satu pedoman pengujian unit adalah bahwa itu harus sangat cepat sehingga pengembang tidak menghindari menjalankannya seperti setiap menit.

Pedoman lain adalah untuk proses integrasi berkesinambungan untuk mengirim e-mail yang mengatakan bahwa ia menemukan unit test yang gagal.

SBel
sumber