ทำไมต้องเขียนโปรแกรมทดสอบ (Automated Testing)
เวลาเราเขียนโปรแกรมไปสักพัก แล้วต้องกลับมาแก้โค้ดเดิมเพื่อเพิ่มฟีเจอร์ใหม่ หลายครั้งเรามักจะเผลอทำส่วนอื่นพังโดยไม่ตั้งใจ การต้องคอยสลับหน้าจอไปมาเพื่อกดทดสอบใน Postman (โปรแกรมจำลองการส่งข้อมูลไปหา API) ซ้ำๆ เป็นเรื่องที่น่าเบื่อและเสียเวลามาก
Automated Testing (การเขียนโค้ดเพื่อทดสอบระบบอัตโนมัติ) คือทางออกที่จะช่วยให้ชีวิตโปรแกรมเมอร์ง่ายขึ้น มันเหมือนกับการมีหุ่นยนต์ผู้ช่วยคอยเช็กงานให้เราทุกครั้งที่กดบันทึกโค้ด ถ้ามีจุดไหนพัง หุ่นยนต์ตัวนี้จะฟ้องเราทันทีโดยไม่ต้องรอให้ผู้ใช้งานเจอข้อผิดพลาด
การฝึกเขียน Test (การทดสอบ) ตั้งแต่ช่วงเริ่มต้นจะช่วยสร้างความมั่นใจให้คุณเป็นอย่างมาก คุณจะกล้าแก้โค้ดมากขึ้นเพราะรู้ว่าถ้าทำอะไรพัง ระบบจะแจ้งเตือนทันที นี่คือทักษะสำคัญที่บริษัทไอทีส่วนใหญ่ต้องการจากนักพัฒนาซอฟต์แวร์มืออาชีพ
เตรียมความพร้อมก่อนเริ่มเขียนโค้ด
ก่อนจะเริ่มเขียนโค้ดทดสอบ เราต้องเข้าใจแนวคิดพื้นฐานก่อน Unit Testing (การทดสอบโค้ดทีละส่วนย่อยๆ) คือการเช็กว่าฟังก์ชันชิ้นเล็กๆ ของเราทำงานถูกต้องไหม ส่วน Integration Testing (การทดสอบการทำงานร่วมกันของหลายส่วน) คือการเช็กว่าเมื่อเอาฟังก์ชันหลายตัวมาต่อกันแล้ว ระบบยังทำงานได้ปกติหรือไม่
ในการทดสอบเราจะมีคำศัพท์ที่ต้องเจอบ่อยๆ อย่าง Mocking (การจำลองฟังก์ชันปลอมมาแทนของจริง) เพื่อให้การทดสอบไม่ไปยุ่งกับฐานข้อมูลจริง และ Assertion (การยืนยันผลลัพธ์) คือการระบุว่าผลลัพธ์ที่ได้จากการทำงานต้องตรงกับที่เราคาดหวังไว้
เพื่อให้การทำงานเป็นระบบ เราจะใช้เครื่องมือที่ชื่อว่า Vitest (เครื่องมือสำหรับรันการทดสอบที่รวดเร็ว) ซึ่งเป็นที่นิยมมากในปัจจุบัน เพราะติดตั้งง่ายและทำงานร่วมกับ TypeScript (ภาษาโปรแกรมที่เพิ่มการระบุชนิดข้อมูลให้ JavaScript) ได้เป็นอย่างดี
ตั้งชื่อไฟล์และโครงสร้างการทดสอบ
การจัดการไฟล์ทดสอบให้เป็นระเบียบช่วยให้เราหาโค้ดเจอได้ง่ายขึ้น โดยปกติเราจะนิยมตั้งชื่อไฟล์โดยมีคำว่า .test.ts หรือ .spec.ts ต่อท้ายชื่อไฟล์เดิม เพื่อให้ Vitest รู้ว่าไฟล์นี้คือไฟล์สำหรับทดสอบนะ
โครงสร้างภายในไฟล์ทดสอบมักจะประกอบด้วย 4 ส่วนหลัก คือ describe (ใช้จัดกลุ่มการทดสอบ), it (ใช้ระบุเงื่อนไขการทดสอบ), expect (ใช้ตรวจสอบผลลัพธ์) และ Matchers (ตัวช่วยเปรียบเทียบค่าที่ได้กับค่าที่คาดหวัง) ซึ่งทำงานประสานกันเพื่อให้เราเห็นภาพชัดเจนว่าการทดสอบผ่านหรือไม่
ตัวอย่างการเขียนโครงสร้างทดสอบเบื้องต้น:
import { describe, it, expect } from "vitest";
// กลุ่มการทดสอบการคำนวณ
describe("ทดสอบฟังก์ชันคณิตศาสตร์", () => {
// เงื่อนไขการทดสอบย่อย
it("ควรบวกเลขได้ถูกต้อง", () => {
expect(1 + 1).toBe(2);
});
});
ในโค้ดด้านบน describe ทำหน้าที่ตั้งชื่อกลุ่มทดสอบ it อธิบายว่าเรากำลังทดสอบอะไร และ expect ตามด้วย toBe คือการยืนยันว่าผลลัพธ์ต้องเท่ากับ 2 หากรันโค้ดนี้ ผลลัพธ์ที่ได้จะเป็นข้อความแจ้งเตือนสีเขียวว่า "Passed" ซึ่งหมายความว่าการทดสอบผ่านฉลุย
ติดตั้ง Vitest และเริ่มเขียน Unit Test
ขั้นตอนแรกคือการติดตั้งเครื่องมือลงในโปรเจกต์ของคุณ ให้เปิด Terminal (หน้าจอพิมพ์คำสั่ง) ในโปรเจกต์ Express ของคุณ แล้วพิมพ์คำสั่งติดตั้งตาม Package Manager (ตัวจัดการแพ็กเกจ) ที่คุณใช้งานอยู่ เช่นถ้าใช้ npm ให้พิมพ์ npm install -D vitest ได้เลย
หลังจากติดตั้งเสร็จ เราจะมาลองทดสอบฟังก์ชันตรวจสอบอีเมลกัน สมมติว่าเรามีฟังก์ชันที่ใช้ตรวจสอบว่าอีเมลที่กรอกมาถูกต้องตามรูปแบบหรือไม่ ถ้าถูกต้องให้คืนค่า true ถ้าไม่ถูกต้องให้แจ้งเตือนข้อผิดพลาด วิธีนี้จะช่วยให้เรามั่นใจว่าระบบลงทะเบียนของเราจะไม่หลุดอีเมลแปลกๆ เข้ามา
ตัวอย่างการเขียน Test สำหรับฟังก์ชันตรวจสอบอีเมล:
import { describe, it, expect } from "vitest";
import validateEmail from "../utils/email-validation";
describe("ทดสอบการตรวจสอบอีเมล", () => {
it("ถ้าอีเมลถูกต้องต้องคืนค่า true", () => {
const email = "test@example.com";
expect(validateEmail(email)).toBeTruthy();
});
});
ในโค้ดนี้เรานำเข้าฟังก์ชัน validateEmail มาทดสอบ โดยใช้ toBeTruthy (ตัวช่วยเช็กว่าเป็นจริงไหม) มายืนยันผลลัพธ์ เมื่อรันคำสั่ง npx vitest ใน Terminal คุณจะเห็นรายการทดสอบแสดงขึ้นมา หากทุกอย่างเรียบร้อยคุณจะเห็นข้อความยืนยันว่าการทดสอบผ่านทั้งหมด
จุดที่มือใหม่มักพลาดและวิธีแก้ไข
ข้อผิดพลาดที่พบบ่อยที่สุดคือการลืมติดตั้ง Dependencies (ไฟล์ที่จำเป็นต้องใช้) หรือการตั้งชื่อไฟล์ไม่ตรงตามรูปแบบ ทำให้ Vitest หาไฟล์ทดสอบไม่เจอ ให้ตรวจสอบเสมอว่าชื่อไฟล์ลงท้ายด้วย .test.ts และมีการ export ฟังก์ชันออกมาให้พร้อมใช้งาน
อีกจุดหนึ่งคือเรื่องของ Asynchronous (การทำงานที่ไม่รอให้จบทีละขั้นตอน) หากฟังก์ชันที่คุณทดสอบมีการดึงข้อมูลจากฐานข้อมูล คุณต้องใส่คำว่า async และ await หน้าฟังก์ชันทดสอบ ไม่อย่างนั้นโปรแกรมจะทดสอบเสร็จก่อนที่ข้อมูลจะถูกดึงมาถึง ทำให้ผลการทดสอบผิดพลาด
คำแนะนำคือให้เริ่มจากทดสอบฟังก์ชันเล็กๆ ที่ไม่ต้องติดต่อฐานข้อมูลก่อน เพื่อสร้างความคุ้นเคย แล้วค่อยขยับไปทดสอบ API จริงๆ การฝึกฝนทีละน้อยจะทำให้คุณไม่รู้สึกท้อและเข้าใจการทำงานของมันอย่างลึกซึ้งโดยไม่ต้องจำ
สรุป: การนำไปใช้ในชีวิตจริง
การเขียน Automated Tests ไม่ใช่เรื่องไกลตัว แต่มันคือการลงทุนเพื่อประหยัดเวลาในอนาคต สมมติว่าคุณกำลังทำโปรเจกต์แอปพลิเคชันจัดการรายการสิ่งที่ต้องทำ (To-Do List) การมีชุดการทดสอบสำหรับฟังก์ชัน "เพิ่มรายการ" จะช่วยให้คุณแก้ไขโค้ดส่วนอื่นได้อย่างมั่นใจโดยไม่ต้องกลัวว่าฟังก์ชันนี้จะพัง
เมื่อคุณเริ่มเขียนฟังก์ชันใหม่ๆ ให้ลองตั้งเป้าว่า "ฉันจะเขียน Test ให้ฟังก์ชันนี้ด้วย" แม้ช่วงแรกจะใช้เวลานานขึ้น แต่ในระยะยาวคุณจะพบว่าคุณไม่ต้องมานั่งไล่แก้บั๊ก (ข้อผิดพลาดในโค้ด) ที่เกิดจากการแก้ไขโค้ดเดิมซ้ำๆ อีกต่อไป
จงจำไว้ว่าโปรแกรมเมอร์ที่เก่งไม่ได้วัดกันที่เขียนโค้ดเร็ว แต่คือคนที่เขียนโค้ดที่ไว้ใจได้และดูแลรักษาง่าย การเริ่มหัดใช้ Vitest ตั้งแต่วันนี้ คือการวางรากฐานสำคัญในการเป็นนักพัฒนาซอฟต์แวร์ที่บริษัทไหนก็อยากร่วมงานด้วยครับ
ที่มา: How to Automate Your Tests in Express Using Vitest — freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More