การใช้ Jest เพื่อทดสอบ TDD ใน Angular
TDD สำคัญอย่างไร?? และทำไมเราต้องใช้ Jest?!?
เกริ่นก่อนว่า บทความนี้เป็นมุมมองที่ได้จากการศึกษาและทดลอง หากส่วนไหนยังไม่ถูกต้อง สามารถแนะนำติชมได้นะคะ
คุณเคยไหม เขียนเว็บ แก้โค้ดไปเรื่อย ๆ จู่ ๆ สิ่งที่เคยทำได้ กลับ Error หรือไม่แสดงผลดังที่เคยเป็นมา แล้วจุดที่เราผิดพลาดไป มันเกิดขึ้นตั้งแต่ตอนไหนล่ะ?? ยิ่งกลับมาอ่านโค้ดก็ยิ่งไม่เข้าใจ ฉันทำอะไรลงไป ปวดหัวชะมัดเลย
ไม่ต้องกินยาพาราค่ะ ปัญหาเหล่านี้จะหายไป ถ้าคุณรู้จัก TDD
เอ๋~~ แล้ว TDD คืออะไร?
TDD (Test Driven Development)
เป็นแนวทางหนึ่งของการเขียนโค้ด นั่นคือคุณต้องเขียน test ก่อน ให้มัน Fail จากนั้นก็มาเขียนโค้ดให้ Pass ซึ่งในภาษาอังกฤษจะเรียกว่า the red-green approach
TDD จำเป็นจริงมั๊ย?
ข้อดีของ TDD คือ
- เขียนโค้ดเท่าที่จำเป็น เมื่อคุณเขียน Test ตามความต้องการหลักของงานแล้ว หน้าที่ของคุณคือทำ test ให้ผ่าน ไม่ต้องมาคิดว่าต้องเพิ่มอะไรรึเปล่า
- แก้งานได้ง่ายขึ้น ทำไมงานใช้ไม่ได้แล้วนะ มันผิดตรงไหนกัน??? ลองกลับไปดูที่ test กันอ๋อออออออ ผิดตรงนี้นี่เอง
- เพิ่ม test coverage การเขียน TDD ทำให้เรารู้ว่าเขียนครอบคลุมตรงไหนบ้าง รึขาดไปตรงไหน และ Jest ที่เราจะใช้ยังช่วยบอก test coverage ได้อย่างมีประสิทธิภาพด้วยน้าาา
- YAGNI หรือ You Are Not Gonna Need It เป็นแนวปฏิบัติที่จะนักพัฒนาจะไม่เพิ่มอะไรเข้าไปจนกว่ามันจะจำเป็นจริง ๆ แน่นอนคุณจะไม่พลาดสิ่งนี้เพราะ TDD จัดให้
สรุปก็คือ ทำตัวทดสอบ (Test) ก่อนการเขียนโค้ด (Coding) ตามสเปค (Specification) ของงาน ซึ่งการทำงานแบบนี้จะได้งานที่ตอบสนองความต้องการของลูกค้ามากขึ้น
ยังไม่ได้เริ่มโค้ดเลย จะรู้ได้ไงว่าต้องเทสตัวไหน
นี่ล่ะค่ะ ความท้าทายของ TDD ที่เราต้องเข้าใจอย่างถ่องแท้ว่างานต้องการอะไร เพื่อนำมาเขียนตัวทดสอบก่อนเริ่มงานแต่ละส่วน และเมื่อคุณทดสอบงานของคุณอยู่เสมอ คุณก็จะรู้ว่าจุดผิดพลาดอยู่ตรงไหน (ไม่ต้องปวดหัว ตามไล่เช็คโค้ดแล้ววววววว ^^)
ทำไมต้อง Jest ?
Jest คือ
เครื่องมือเขียนทดสอบ (Testing) JavaScript Framework โดยผู้พัฒนาคือ Facebook
ซึ่งสามารถทำงานกับโปรเจกต์เช่น Babel, TypeScript, Node, React, Angular, Vue และอีกมากมาย
Jest จ๋า ดียังไง?
- เร็ว และปลอดภัย
- snapshots testing ตรวจให้ว่า UI ของเราจะไม่เปลี่ยนไปกะทันหัน
- การทดสอบจะทำงานแบบขนาน (Parallelized) ทำให้เพิ่มความเร็วในการทำงานอย่างมาก ที่สำคัญไม่ต้องใช้ browser เหมือน Karma ด้วยนะ
- สามารถดู CODE COVERAGE ได้โดยไม่ต้องติดตั้งเพิ่ม
- great API: Jest มีเครื่องมือทุกอย่างในที่เดียว และมี Document ที่ดี จึงใช้งานได้ง่าย
มาดูกันว่าถ้าใช้ Jest ใน Angular จะเป็นยังไง
สิ่งแรกที่ต้องทำคือ ตรวจว่าในเครื่องของเรามี environment เพียงพอในการพัฒนา Angular รึยัง
ติดตั้ง Angular
สิ่งที่ต้องมี
- node.js
- npm จะมาพร้อมกับการติดตั้ง node.js
Check version เพื่อตรวจสอบว่ามีอยู่ในเครื่องรึไม่
node.js :
node -v
npm :
npm -v
ถ้าพร้อมแล้ว Let’s go!!
1. ติดตั้ง the Angular CLI แบบ globally
npm install @angular/cli -g
2. สร้าง Angular Application
ng new my-app
หลังใช้คำสั่ง จะมีคำถามว่าจะเพิ่ม Angular routing หรือไม่ และใช้ style sheet แบบไหน
ซึ่งในโปรเจกต์ตัวอย่าง จะเพิ่ม routing และใช้ style sheet แบบ Less
3. หลัง Angular CLI สร้างโปรเจกต์เรียบร้อย ดูซิว่าใช้ได้จริงไหม?
cd my-app
ng serve
ไปที่ http://localhost:4200/
หลังจากนี้เราจะมาเพิ่ม Jest ลงไป
ติดตั้ง Jest
1. ติดตั้ง jest แบบ globally
npm install -g jest
เพื่อให้ Jest เป็น test runner เราจะใช้ jest-preset-angular ในการติดตั้ง ซึ่งจำเป็นจะต้อง config ตามรายละเอียดใน README.md มาเริ่มไปพร้อมกันเลย!
2. ลง dependencies ทั้งหมดที่จำเป็น (จะใช้ npm หรือ yarn ก็ได้)
yarn add -D jest jest-preset-angular @types/jest
# or
npm install -D jest jest-preset-angular @types/jest
3. สร้างไฟล์ setupJest.ts
ในโฟลเดอร์ my-app/src โดยมี code ตามข้างล่าง
4. สร้างไฟล์ jestGlobalMocks.ts
ในโฟลเดอร์เดียวกันกับไฟล์ setupJest.ts
5. และเพิ่ม code นี้ลงใน package.json
{
"jest": {
"preset": "jest-preset-angular",
"setupFilesAfterEnv": ["<rootDir>/src/setupJest.ts"]
}
}
6. เปลี่ยนชื่อไฟล์src/test.ts
เป็น src/karmaTest.ts
เพื่อไม่ให้ Karma กับ Jest ทำงานทับซ้อนกัน
เปลี่ยนชื่อไฟล์ src/test.ts
เป็น src/karmaTest.ts
7. เมื่อเราทำตามขั้นตอนครบแล้ว มาลองกัน
jest
หลังจากที่เราติดตั้ง Jest ให้ทำงานบน Angular project ได้แล้ว ไปที่หัวข้อถัดไป
จับมารวมกันนนนนน!! (TDD Jest Angular)
หัวข้อสุดท้ายก่อนนำไปใช้จริง เรามาลองสร้าง TDD ของตัวเองกันค่า
ซึ่งในหัวข้อนี้ จะอธิบายเพียงหลักการทำงานของ TDD ดังนั้นจะไม่ลงรายละเอียดในส่วนของ test case นะคะ
เริ่มแรกสร้าง component ในโปรเจกต์ขึ้นมาใหม่
ng g c favorite-animals
หลังจากสร้าง component มาแล้ว จะมีไฟล์ถูกสร้างมาในโฟลเดอร์ชื่อ favorite-animals อยู่ 4 ไฟล์นั่นคือ
- favorite-animals.component.html (ไฟล์ html ของ component)
- favorite-animals.component.less(ไฟล์ less ของ component) ซึ่งเป็นไปตาม style sheet ที่เลือกในตอนสร้าง angular
- favorite-animals.component.spec.ts (ไฟล์ test ของ component)
- favorite-animals.component.ts (ไฟล์ component หลัก)
หลังจากได้ component มาแล้ว สิ่งแรกที่เราต้องทำก็คือ……..
สร้าง title ตื้ดดดดดดดดดดดดด ❌
สร้าง navbar ตื้ดดดดดดดดดดดดด ❌
ตามหลัก TDD ของเรา อย่าพึ่งลืมนะคะ ต้องสร้าง test ก่อนเริ่ม coding ค่า
มาที่ไฟล์ favorite-animals.component.spec.ts
บรรทัดที่ 3 : import { By } from ‘@angular/platform-browser’; เพื่อนำมาเขียนทดสอบในบรรทัดที่ 28
บรรทัดที่ 27 : เราจะเพิ่มตัวตรวจสอบว่า มี title อยู่ใน <h1> และมี content ตามที่เขียนไว้หรือไม่
เจอ failed สีแดง ไม่ต้องตกใจกัน เราทำให้ pass ได้
เรามาเขียนสิ่งที่ตัว test ต้องการกัน
หลังจากที่เราเขียนโค้ดแบบ TDD ตัวแรกได้แล้ว มาลองเพิ่ม test case อีกตัวกัน
จาก test case ด้านบน ต้องการให้มี <span>ที่แสดงข้อความว่า Hello world
จัดไปเลยยยยยยยย
มาถึงตรงนี้ ทุกคนคงเข้าใจหลักการทำงานของ TDD กันแล้ว ซึ่งก็คือ
เขียน test case →Fail ❌ →ทำตาม test case →Pass ✔️
เมื่อทำตาม process เหล่านี้ได้ งานของเราก็ไม่ต้องมาปวดหัวกับการไล่โค้ดแล้ว
(ปวดหัวตอนเขียน test case แทน ตึ่งโป๊ะ!)
ถึงอย่างนั้น ถ้าเรารู้สาเหตุของข้อผิดพลาดก็ย่อมแก้ปัญหาได้ง่าย และรวดเร็วกว่า
มาฝึกทำงานโดยใช้ TDD ให้คล่องกันเถอะค่ะ 😉😉
หากต้องการเข้าใจเรื่องการเขียน Test case มากขึ้น แนะนำบทความข้างล่างนี้นะคะ
และสามารถศึกษาเพิ่มเติมได้ทั่วไปเลยค่า จบบทความแล้ว หวังว่าบทความนี้จะเกิดประโยชน์ต่อผู้ที่สนใจไม่มากก็น้อยนะคะ หรือถ้ามีแหล่งความรู้อื่น ๆ ก็นำมาแบ่งปันกันได้ค่า ❤️❤️
source code :