สร้างโปรเจ็คเริ่มต้นแบบง่ายๆ ด้วย Koa Node.js Framework | Unittest

Kamonwat
3 min readMar 29, 2018

--

Unittest นับเป็นขั้นตอนอีกขั้นตอนที่สำคัญ และควรที่จะมีอยู่ในขั้นตอนการพัฒนา ซึ่งจะช่วยให้การพัฒนา ปรับปรุง และต่อยอดง่ายขึ้น มีประสิทธิภาพมากขึ้น และใช้เวลาน้อยลง เนื่องจากมีโอกาสเกิดข้อผิดพลาด (Bugs) ที่น้อยลง ด้วยเหตุนี้ Developer ทุกคนควรจะมี Unittest อยู่ในสายเลือดดด 🤣

Unittest คืออะไร

Unittest คือ การทดสอบส่วนที่เล็กที่สุดของโค้ด เพื่อยืนยันว่าเมื่อโค้ดมีการเปลี่ยนแปลง โค้ดส่วนนั้นก็ยังสามารถทำงานได้ถูกต้อง

ส่วนที่เล็กที่สุด (Unit) หมายถึง Function หรือ Method ที่มีการทำงานจบในตัวเอง ไม่มีการเรียก Function หรือ Method ซ้อนข้างในอีกที

function helloWorld() {
showText('Hello World);
}
function showText(text) {
console.log(text);
}

จากโค้ดฟังก์ชั่น helloWorld() ยังไม่ใช่ส่วนที่เล็กที่สุด เนื่องจากภายในฟังก์ชั่นมีการเรียกฟังก์ชั่น showText() อีกที โดยฟังก์ชั่น showText() ถือว่าเป็นส่วนที่เล็กที่สุดแล้ว เพราะว่าภายในฟังก์ชั่นไม่มีการเรียกฟังก์ชั่นอื่นภายใน มีการทำงานจบในตัวเอง

ติดตั้ง Library สำหรับทำ Unittest

Unittest ในแต่ละภาษาก็จะมี Library ที่มาช่วยให้การทำ Unittest นั่นง่ายขึ้น โดยในบทความนี้เราจะทำ Unittest ใน Node.js โดยใช้ Jest มาช่วยในการทำ Unittest สาเหตุที่ใช้เนื่องจาก Jest เร็ว การแสดงผลสวย ไม่ต้องติดตั้ง Dependencies เพิ่ม และสามารถทำ Test Coverage ได้เลย มาเริ่มกันเลยย ทำการติดตั้ง Denpendencies ที่เกี่ยวข้อง

Test Coverage คือการตรวจสอบว่าเราทำการทดสอบโค้ดของเราทุกส่วนไหม ไม่ได้เป็นตัวบ่งบอกคุณภาพของการ Test

yarn add --dev jest supertest

jest Library สำหรับการทำ Unittest
supertest Library สำหรับทดสอบ HTTP Server

เริ่มเขียน Unittest แรกกันเลยยย

ในบทความนี้เราจะทำ Unittest ให้กับ Koa Sample Application ที่เราได้ทำการสร้างในบทความที่แล้ว(จิ้มเบาๆ แล้วไปดูได้เลยย)

ทำการสร้างไฟล์ index.test.js ที่ /tests/routes และเขียนโค้ดกันเลย

const server = require('../../index.js');
const request = require('supertest');
afterEach(() => {
server.close();
});
describe('routes: index', () => {
test('should response as expected', async () => {
const response = await request(server).get('/');
expect(response.status).toEqual(200);
expect(response.type).toEqual('application/json');
expect(response.body.msg).toEqual('Hello World');
});
});

โดยจะใช้ Supertest สำหรับสร้าง HTTP Server และยิง Request ไปยัง Root path (‘/’) ที่เราต้องการทดสอบโดยเมื่อได้ Response กลับมาเราจะใช้ Jest เพื่อตรวจสอบว่าได้ Response กลับมาถูกต้องตามที่เราคาดหวังไหม โดยจะใช้เมทธอด expect() และเรียกใช้ Tail Call .toEqual() (สามารถดูเมทธอด และ Tail Call ของ Expect ได้จาก Expect Documents) สำหรับตรวจสอบว่า Response ที่ได้ตรงกับที่เราต้องการไหม ซึ่งถ้าไม่ตรงก็จะ Test ไม่ผ่าน 😂

จากนั้นกำหนด Directories และ Files ที่จะให้ Jest ไปตรวจสอบสำหรับการทำ Test Coverage โดยเพิ่มโค้ด ไปที่ไฟล์ package.json

"jest": {
"testEnvironment": "node",
"collectCoverageFrom": [
"libs/**",
"models/**",
"routes/**"
]
}

ในที่นี้จะให้ Jest ไปตรวจสอบโค้ดสำหรับ Test Coverage จาก /libs /models และ routes/

สุดท้ายเพิ่ม Script สำหรับรัน Test ที่ไฟล์ package.json

..."scripts": {
...
"test": "jest"
}
...

มาเริ่ม Test กันดีกว่าา

รัน Test ด้วยคำสั่ง โดย Jest จะไปรัน Test จาก Directory ที่ชื่อว่า /tests (เป็นค่าเริ่มต้น)

yarn jest
Test Success ! 🎉

หาก Test ไม่สำเร็จก็จะมีการแจ้งว่าไม่สำเร็จเพราะเหตุอะไร และเกิดที่ไฟล์ไหน บรรทัดไหน ซึ่งช่วยให้เราสามารถเข้าไปแก้ไขได้ง่ายขึ้นและเร็วขึ้น 👍🏻

Test Failure 😭

หากต้องการดู Test Coverage ด้วยก็ให้รันคำสั่งด้วยการเติม Option — coverage เข้าไปหลัง Script

yarn test --coverage
Test with Test Coverage 🚀

นอกจากเราสามารถดู Test Coverage ได้อีกแบบนอกเหนือจากดูผ่าน Console เมื่อเราทำการรัน Script แล้วเราจะได้ Directory /coverage มา ซึ่งภายในจะมีผลการทดสอบเป็นไฟล์ .html ให้เราได้ชมกัน ซึ่งสามารถเปิดไฟล์ได้จาก /coverage/lcov-report/index.html

สรุป

สำหรับการทำ Unittest นั้น อาจทำให้เราเสียเวลาเพิ่มขึ้น แต่ก็ถือว่าคุ้มค่ากับที่เสียไป เพราะช่วยยืนยันการทำงานของโค้ดได้ว่าจะถูกต้องเมื่อเรามีการเปลี่ยนแปลงโค้ด ซึ่งช่วยลดข้อผิดพลาด (Bugs) และหากเกิดข้อผิดพลาดขึ้นก็ช่วยให้เราแก้ไขได้ง่ายขึ้น เพราะฉะนั้น Unittest จึงเป็นสิ่งที่ Developer ควรทำอย่างยิ่ง เสียเวลาสักนิด เพื่อประโยชน์มหาศาลในกาลหน้า 😎

Source Code : Sample Koa Application

สร้างโปรเจ็คเริ่มต้นแบบง่ายๆ ด้วย Koa Node.js Framework | Getting started

สร้างโปรเจ็คเริ่มต้นแบบง่ายๆ ด้วย Koa Node.js Framework | Unittest

--

--