RiskReduced-760x507
ในการทดสอบ Software นั้น มีวิธีการและแนวทางที่เยอะมาก
ดังนั้น เรามาลองแบ่งกลุ่มของการทดสอบ
ตามแนวทางของ Five Ws กันหน่อย

ประกอบไปด้วย

  1. Who ? ทดสอบเพื่อใคร
  2. What ? ทดสอบอะไร
  3. Where ? ทดสอบที่ไหน
  4. When ? ทดสอบเมื่อใด
  5. Why ? ทดสอบไปทำไม
  6. 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