
Mengapa anda mahu menulis kes ujian untuk aplikasi anda? Nah, ini adalah persoalan yang cuba dihindari sebilangan pemaju, semata-mata kerana memerlukan usaha dan masa, dan kerana ujian manual jauh lebih memuaskan. Klik… klik… isi borang… Klik… Presto. Aplikasi saya berfungsi, API saya bagus, semuanya adalah dory.
Maju pantas hingga hampir 30 permintaan tarikan sehari digabungkan ke cawangan induk anda. Sekarang bagaimana perasaan anda tentang menguji 30 ciri secara manual atau mengubah semula sekatan kod dan secara tidak sengaja melanggar kod orang lain?
Pada ketika ini anda biasanya berkata, "Saya harap saya menulis beberapa kes ujian untuk memulakannya." Oleh itu, ambil inspirasi dari Facebook: mereka berkongsi artikel yang cukup menarik di sini, menerangkan bagaimana pasukan itu mengembangkan React 16 dengan pengembangan yang didorong oleh ujian.
Aplikasi nod dengan sendirinya cukup mudah dibina. Terdapat banyak sokongan komuniti yang terlibat, dan biasanya anda akan mendapat apa yang anda perlukan dengan bertanya-tanya. Aplikasi nod boleh menjadi pelayan proksi yang hebat untuk sebilangan pelayan API, sehingga menjadikan ujian akhir mereka lebih penting.
Dalam artikel ini saya telah meliputi bagaimana untuk setup dan menulis kes-kes asas ujian unit dengan laporan liputan untuk aplikasi Node.js .Oleh itu mari kita masuk.
Helo Ava
Ava adalah pelari ujian JavaScript. Ia menggunakan sifat Node async I / O dan menjalankan ujian serentak, sehingga mengurangkan masa ujian anda.
Mari kita mulakan
Di direktori kerja anda, buat package.json
fail dan tambahkan pakej berikut:
yarn add ava babel-register
Buat folder ujian . Sangat berguna untuk menjaga ujian anda di satu tempat. Anda juga boleh menyimpan modul / pengawal ujian di sana.
package.json
Kini anda yang dikemas kini kelihatan seperti ini:
{ "name": "ava-test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start" : "node server.js", "test": "node_modules/.bin/ava tests/**/*.test.js --verbose", "test:watch": "node_modules/.bin/ava --verbose --watch" }, "dependencies": { "ava": "^0.23.0", "babel-register": "^6.26.0" }, "ava": { "require": [ "babel-register" ] }}
The babel-register
transpiles kod ES6 di runtime dalam kes beberapa mesin berjalan pada versi Node lama yang tidak menyokong ES6. The verbose
bendera akan memberikan kita beberapa output kemas bergantung kepada sama ada ujian kami gagal atau lulus. Bendera ini cukup berguna semasa menyahpepijat ujian anda, tetapi jika anda menulis beratus-ratus kes ujian, anda mungkin mahu mematikannya.
Di dalam anda tests/index.test.js
, anda boleh menambahkan kes ujian pertama anda:
Perkara yang berguna mengenai Ava ialah ia membolehkan anda menjalankan ujian async, melalui fungsi menanti async. Sintaksnya juga agak mudah. Kaedah rancangan membolehkan kami menyebut secara jelas jumlah penegasan yang kami ingin per ujian.
Berjalan yarn test
dari konsol anda memberi anda output berikut:

Sekiranya salah satu ujian kami gagal, kami akan mendapat:

Itulah keindahan verbose
mod. Ini memberi anda timbunan ralat bersih dan tidak ada sampah jejak tumpukan. Sekiranya anda mengalami ralat runtime, anda akan melihat sorotan sintaks yang bagus juga.
Anda benar-benar dapat memanfaatkan API Ava dan menggunakan alat penegasannya yang kuat untuk menulis kes ujian fleksibel.
Menyiapkan pelayan Node anda
Sehingga kini, kami hanya membincangkan mengenai persediaan asas untuk ujian penulisan - dan jujurlah, ini agak lurus ke hadapan. Oleh itu, di bahagian ini, saya akan menerangkan bagaimana pelayan Node mudah dapat dipisahkan dan titik akhirnya diuji dengan Ava.
yarn add express body-parser
Di direktori kerja anda, buat app.js
dan tambahkan coretan berikut:
Sebab saya mengeksport modul aplikasi adalah supaya dapat digunakan dengan pelayan API palsu sehingga Ava perlu menjalankan ujian anda.
Buat fail baru server.js
dan import modul aplikasi untuk memulakan pelayan.
Menjalankan npm start harus memulakan pelayan anda, dan menavigasi ke // localhost / status end point akan memberi anda respons 200OK.
Hebat, jadi pelayan kami berfungsi.
A quick glance of the code shows that we’ve created 3 endpoints: a status endpoint, a greet endpoint, and a register endpoint. There is some validation on the register end point, which throws a 400(Bad request) in case post body params are missing. The above validation method is pretty naïve, but it serves our purpose of endpoint testing — so I’m going to stick with it.
Pro tip : You can always assign error handling to a middleware and use next to invoke the error handler.Let’s write some more tests around the endpoint. I will use the supertestmodule. It’s very similar to superagent: it uses the same APIs, and has a similar syntax. So, win-win.
We have imported the previously exported app
module and passed it into supertest. Supertest creates a proxy server, which will then hit all the endpoint URLs mentioned in the test. You can use the deepEqual
method to test the entire object or the is
method to manually test each field.
Running the yarn test will yield the following:

Great. We’ve written four tests and they all pass as expected. But what about code coverage?
Hello nyc
For creating those lovely coverage reports, we’ll use nyc which is Istanbul.js’ command line interface. It’s very easy to use and has a lot of configurable options. For the sake of simplicity, we’ll use a very simple configuration.
yarn add nyc --save
The nyc command wraps nicely over your test command and will create a coverage folder (this should be in your gitignore) in your working directory.
Update your package.json
as shown below:
{ "name": "ava-test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "node_modules/.bin/ava tests/**/*.test.js --verbose", "test:watch": "node_modules/.bin/ava --verbose --watch", "cover": "node_modules/.bin/nyc yarn test", }, ... other dependencies "nyc": { "reporter": [ "lcov", "text", "html" ] }}
The types of reporter you want can be configured in the nyc section of your package.json
file.
Let’s run yarn cover:

Okay so we don’t have 100% coverage yet. Let’s fix that. First you’d want to go into the coverage folder of your working directory and see which part of your code hasn’t been covered.

Clearly we missed a spot. Let’s add our final test case in the tests/index.tests.js
file, which will cover the entire app.js
file.
test('Create a new user', async t => { let username = 'some-hase' const password = 'some-hase' const response = await request(app) .post('/register') .send({username, password});
t.is(response.status, 200); t.is(response.body.message, `new user created`);});
And now….

Presto.
Pro tip: If you want to add a threshold for test cases you can add a script in your package.json file."check-coverage": "node_modules/.bin/nyc check-coverage --lines 100 --functions 100 --branches 100 --statements 100"
This command can be run as part of your travis / gitlab pipeline build systems.
Conclusion
We’ve covered a basic setup with Ava for unit test cases of your Node APIs. The documentation is really extensive and can be referred to in case of doubt.
PS: Hope you like the article, correct me if I am wrong anywhere. Always welcome a discussion.