Tossapon Nuanchuay
ntossapo
Published in
3 min readJun 15, 2016

--

How to Test NodeJS with Mocha and SuperTest

ห่างหายกันไปนาน สำหรับการเขียน blog จริงๆ ก็ไม่ได้ไปไหน นั่งเล่นเจ้า intel xdk อยู่ เดี่ยวจะมาเล่าสู่กันฟังว่ามันเป็นยังไง

แต่วันนี้ขอพล่ามเรื่องการ test บน node นิดนึง เพราะก่อนหน้านี้เขียนเทคนิคต่างๆบน nodejs แต่ยังไม่มีวิธีการทดสอบเลย

โดยก่อนหน้านี้ เคยเขียนทดสอบโดยใช้ jasmine แต่มันนานมาแล้วผมจำไม่ได้ เลย search ใหม่ใน google ถึงวิธีการทดสอบ
เลยได้มาพบกับเจ้าตัว Mocha และ SupterTest สำหรับการทำ Web Integration Test ลองมาดูันเลยครับ

ขั้นแรกติดตั้ง dependencies ที่ต้องใช้ก่อนครับ
npm install express body-parser
ติดตั้ง express, body-parser

npm install supertest
ติดตั้ง supertest อาจจะใส่ –save-dev เพื่อบอกว่าใช้เฉพาะตอน develop เท่านั้น

npm install -g mocha
ติดตั้ง mocha แบบ global คือ สามารถใช้งานผ่าน command-line ได้

ลองสั่ง mocha ใน command-line ครับ

จะได้ประมาณนี้ก็ไม่ต้องตกใจครับ

โดยการทำงานของ mocha นี้จะเป็นตัว Runner สำหรับ nodeJS ครับ โดยจะทำการทดสอบไฟล์ที่อยู่ใน folder test ครับ

พูดง่ายๆคือ เขียนไฟล์ทดสอบไว้ใน folder test นั้นแหละ

project file structure ก็จะประมาณนี้ ไฟล์ testFibonacci.js และ _testUser.js จะถูกทดสอบครับ

ขั้นแรกเราเขียน code สำหรับ nodejs server ก่อนเลยครับ step เดิม

ครับ โดยคราวนี้ เราจะต้อง export ตัว server ออกไปเพื่อนใช้ในการทำ integrate test ครับ

ในเรื่องนี้ผมจะไม่ทำ Test-Driven นะครับ ขอ implement ก่อนเลย โดยผมจะ implement fizzbuzz นะครับ
ถ้าเลข input หารด้วย 3 ลงตัว ให้ output ว่า fizz
ถ้าเลข input หารด้วย 5 ลงตัว ให้ output ว่า buzz
ถ้าเลข input หารด้วย 3 และ 5 ลงตัว ให้ output ว่า fizzbuzz
นอกเหนือจากนั้นให้แสดงเลขครับ
นี้คือกฏของ fizzbuzz นะครับ

ผมก็ implement แบบนักศึกษาทั่วไปนี้แหละ ลองเปิดเว็บใส่เลขดู 3 5 โอเคผ่าน
มันก็ถูก

“แล้วมันถูกจริงๆ หรอ”

“แล้วเราจะทดสอบมันยังไงละ”

“ก็เขียนเทสไง”

“เขียนไงอะ”

เปิดตัวพระเอกของเราเลยครับ mocha กับ supertest ไม่พูดพล่ำทำเพลง ลองเลย
ผมสร้าง folder test และ สร้างไฟล์ testFizzBuzz.js ไว้ใน folder test

จากนั้น

จาก code นะครับ
เราดึง supertest มาใช้ โดยใช้คำสั่ง
var request = require('supertest')

และเราดึง instance ของ server มาใช้ จากการที่เรา export server ออกมาที่ไฟล์ app.js
var server = require('./../app');

describe คือหมวดหมูการทดสอบครับ ผมใช้ชื่อหมวดการทดสอบนี้ว่า
testFizzBuzz

it คือเทสเคสครับ ใส่คำอธิบายให้สื่อความหมายด้วยละ

จากนั้นผมบอกให้ supertest(request) request ไปที่ server ครับ
request(server)

เรียกไปที่ path /3 แบบ get
.get('/3')

แล้วเราก็ใช้ .expect ไปว่าเราคาดหวังอะไรกับผลลัพธ์
.expect(200)
คือการได้รับ response message code 200 ก็คือ response ok นั้นเอง

ใช้ .expect อีกครับ เพื่อเพิ่ม spec ครับ
.expect("fizz", done);
อันนี้ผมคาดหวังการตอบกลับมาว่า fizz ครับ และ done คือจบการทำงานของเคสนี้

จากนั้นลองใช้ mocha ทดสอบครับ

มาหวะๆ เคสแรกผ่านครับ หลังจากนั้นก็เพิ่มเคส

เคสต่อไป

เคส /5 ก็โอเค ผ่านครับ

เคสต่อไป

นั้นแหละฮะท่านผู้ชมฮะ error ทันที ไหนว่าทำถูกแล้ว จากเคสนี้ รู้ได้ทันทีว่าทำงานผิดพลาดตรงไหน ก็ลองแก้เลยครับ อันนี้ implement ตามสะดวก

ผม implement มาประมาณนี้ ครับ และก็รันผ่าน

“เราจะต้องเขียนเทสเคสมากขนาดนั้น”

“ก็เขียนจนกว่าจะมั่นใจครับ”

จนผมได้ฟังก์ชันที่ strong พอที่จะทำงานได้ นี้คือข้อดีของการเขียนเทสครับ

ก็พอหอมปากหอมคอสำหรับ supertest และ mocha มันยังทำอะไรได้อีกเยอะครับ ลองหาอ่านได้ที่ document ครับ

การทดสอบนั้นเป็นเรื่องที่หลายคนมองข้ามไปเยอะมาก จริงๆ แล้วเราควรใส่ใจกับการทดสอบให้มากครับ มันบอกอะไรหลายๆ อย่างได้ โดยเฉพาะจุดที่เราผิดพลาด เกิดบั๊ก เป็นด่านแรกของ software ในการไปเผชิญโลกกว้างครับ

ยังๆ ก็ลองมาเขียนเทสกันดูนะครับ

Originally published at www.ntossapo.me on June 15, 2016.

--

--