ในการทดสอบ Software นั้น มีวิธีการและแนวทางที่เยอะมาก
ดังนั้น เรามาลองแบ่งกลุ่มของการทดสอบ
ตามแนวทางของ Five Ws กันหน่อย
ประกอบไปด้วย
- Who ? ทดสอบเพื่อใคร
- What ? ทดสอบอะไร
- Where ? ทดสอบที่ไหน
- When ? ทดสอบเมื่อใด
- Why ? ทดสอบไปทำไม
- How ? ทดสอบอย่างไร
มาดูในรายละเอียดกันดีกว่า
ซึ่งน่าจะทำให้เห็นว่า เราทำการทดสอบไปทำไม เพื่ออะไร
ซึ่งมันช่วยลดความเสี่ยงต่าง ๆ ลงไปได้เยอะ
1. Who ? Programmer vs. Customer
เราทำการทดสอบเพื่อทำให้มั่นใจว่า
software ทำงานได้ตามที่คาดหวังนะ
ทั้งในมุมมองของ Programmer และ Customer (ลูกค้า)
ซึ่งแต่ละฝั่งต่างมีชุดการทดสอบ
เพื่อสร้างความเชื่อมั่นให้ตนเอง
ว่าได้ software ตามที่คาดหวังนะ
2. What ? Functionality vs. Performance vs. Security
ต้องบอกให้ได้ว่า เรากำลังทดสอบอะไรกัน
ซึ่งโดยทั่วไปถ้าเราไม่ได้กำหนดแบบเฉพาะเจาะจง
ก็มักจะบอกว่า เราทำการทดสอบ feature ต่าง ๆ นั่นเอง
หรืออาจจะเรียกว่า Functional requirement
แต่สิ่งที่มักจะลืมไปก็คือ Non-functional requirment เช่น Performance และ Security เป็นต้น
3. When ? ทำการทดสอบ หรือ สร้างการทดสอบเมื่อใด ?
ทำก่อน หรือ หลังจากการเขียน code ?
ถ้าเราทำการสร้างและทดสอบหลังจากที่เขียน code เสร็จ
จะเรียกว่า Test Last
ถ้าเราทำการสร้างและระบุการทดสอบก่อนที่จะเขียน code
จะเรียกว่า Test First
จากทั้งสองแบบนั้น จะพบว่า Test First มันแปลก ๆ ดูไม่เป็นธรรมชาติเลย
เนื่องจากจะทดสอบได้ยังไง ถ้าไม่เขียน code ให้เสร็จก่อน !!
แต่มันกลับมีข้อดีต่าง ๆ ดังนี้
- ทำให้มั่นใจได้ว่า code ที่เขียนมันทดสอบได้
- ป้องกันไม่ให้เกิดความผิดพลาดจาก code ที่เขียนขึ้นมา ซึ่งมันเป็นวิธีที่ดีกว่า การมานั่งจุดผิดพลาดและแก้ไข
- ทำให้สามารถออกแบบโครงสร้างของ code ได้ พร้อมลงมือสร้างมันขึ้นมาตามที่เราคิด
4. Where ? Unit test vs. Integration test vs. System test
การทดสอบนั้นมีหลายระดับเช่น Unit, Integration และ System เป็นต้น
- Unit test คือการทดสอบส่วนทำงานหน่อยเล็ก ๆ เช่น class และ method
- Integration test คือการทดสอบการทำงานระหว่างหน่วยการทำงานเล็ก ๆ ว่ามันเป็นอย่างไร
- System test คือการทดสอบในภาพรวมของระบบ
คำถามคือ จะทดสอบในระดับไหนดีบ้าง ?
จงตอบมาหน่อยสิ !!
ซึ่งจำนวนการทดสอบควรเป็นไปตาม Test Pyramid นะ
ยิ่งเป็นการทดสอบในภาพใหญ่ หรือ ภาพรวมของระบบ
จำนวนการทดสอบยิ่งต้องลดน้อยลงไป
5. Why ? Verification vs. Specification vs. Design
ทำการทดสอบไปทำไม ?
ในแต่ละการทดสอบควรมีเหตุผลที่เหมาะสม
ว่าจะทดสอบไปทำไม ? เพื่ออะไร ?
เช่น
- ตรวจสอบการทำงานของ code ของระบบว่า ทำงานได้ตรงตามความคาดหวังนะ
- ตรวจสอบว่าทำงานตาม specification นะ
- ตรวจสอบว่า code ของระบบทำงานตามที่ได้ออกแบบไว้นะ
คำถามที่น่าสนใจ คือ เราจะทำอย่างไร ?
เพื่อให้เรารู้ได้อย่างรวดเร็ว
ว่าแต่ละ feature ทำงานได้ถูกต้อง
ว่าแต่ละ feature ทำงานได้ตรงตาม spec
ว่าแต่ละ feature มีการทำงานตามการออกแบบ
6. How ? Automated test vs. Manual test
จะทำการทดสอบอย่างไรดีล่ะ ?
ทดสอบแบบ manual หรือ แบบอัตโนมัติดี ?
หรือทำการทดสอบด้วยคน หรือ เครื่องคอมพิวเตอร์ดี ?
โดย Manual testing นั้นจะมีประโยชน์อย่างมาก
ถ้าทำการทดสอบในรูปแบบ Exploratory testing
แต่ถ้าระบบงานที่คุณดูแลนั้น
ต้องทำการ deploy/release feature ใหม่ ๆ อยู่อย่างสม่ำเสมอ
นั่นหมายความว่า
คุณต้องทำการทดสอบซ้ำแล้วซ้ำอีกในทุก ๆ feature
หรือเรียกว่าต้องทำ regression testing อยู่เสมอ
ถ้าทำการทดสอบแบบ manual คงไม่น่าจะไหว
ดังนั้นมาทำการทดสอบแบบอัตโนมัติน่าจะเหมาะสมกว่านะ
หรือถ้าทนได้ก็ทำไป !!
มาดูตัวอย่างการนำ Five Ws มาคิด วิเคราะห์ แยกแยะ
ปล. ให้ลองเขียนด้วยตอนเองก่อน แล้วเอามาเทียบกันนะครับ
TDD (Test-Driven Development)
- Who ? => เพื่อ Programmer
- What ? => Functionality
- Where ? => Unit และ Integration test
- When ? => ก่อนที่จะเขียน code
- Why ? => ทำการออกแบบ และ กำหนดการทดสอบของสิ่งที่จะพัฒนา
- How ? => Automated test
BDD (Behaviour-Driven Development)
- Who ? => เพื่อ Customer
- What ? => Functionality
- Where ? => System test
- When ? => ก่อนที่จะเขียน code
- Why ? => ทำการออกแบบ และ กำหนดการทดสอบของสิ่งที่จะพัฒนา
- How ? => Automated test
Exploratory test
- Who ? => เพื่อ Customer
- What ? => Functionality
- Where ? => Unit และ Integration test
- When ? => หลังจากที่เขียน code เสร็จแล้ว
- Why ? => เพื่อทำการตรวจสอบความถูกต้องของระบบ
- How ? => Manual test
Security test
- Who ? => เพื่อ Customer
- What ? => Security
- Where ? => System test
- When ? => หลังจากที่เขียน code เสร็จแล้ว
- Why ? => เพื่อทำการตรวจสอบความถูกต้องของระบบ
- How ? => Automated test
โดยทั้ง 6 ข้อนี้ น่าจะพอทำให้เราเห็นว่า
ทำการทดสอบในมุมมองของใครบ้าง ?
ทำการทดสอบอะไรบ้าง ?
เมื่อใดควรทำการทดสอบ ?
ทำการทดสอบส่วนไหนบ้าง ?
ทำการทดสอบไปทำไม ?
และทำการทดสอบอย่างไร ?
ซึ่งถ้าคุณสามารถตอบคำถามเหล่านี้ได้
น่าจะช่วยลดความเสี่ยงต่าง ๆ ลงไปได้
หรือทำให้เห็นว่า คุณมีความเสี่ยงอะไรบ้าง
เพื่อจะได้ทำการแก้ไขต่อไปนั่นเอง
Reference Website
http://securesoftwaredev.com/2012/09/03/a-classification-of-tests/
http://martinfowler.com/bliki/TestPyramid.html