บทความนี้กลับมาที่ Software development life cycle กันอีกครั้งนะครับ หลังจากที่เราเขียนโค๊ดและทำ Unit testing เสร็จแล้ว ต่อมาก็เป็นเรื่องของ … Testing อีกนั่นแหละ ฮ่าๆ แต่เป็นมุมมองใหม่ๆที่ไม่ซ้ำเดิม สนุกแน่นอนครับ

Integration Testing
วัตถุประสงค์สำคัญของ Integration testing ก็คือการประกอบร่างส่วนเล็ก (Module) ที่ถูกพัฒนาโดย Developers หลายๆคนเข้าด้วยกันเพื่อสร้างระบบที่ทำงานได้และทดสอบว่าระบบนั้นทำงานได้ตาม Requirement ที่กำหนดไ้ว้ครับ
เพื่อนๆอาจจะสงสัยว่า “ขั้นตอนที่แล้วเราก็ทำ Unit testing อย่างละเอียดมาแล้วนะ ในเมื่อส่วนเล็กๆทำงานได้ถูกต้องแล้ว พอเอามารวมกันก็ต้องทำงานได้ซิ” การจะตั้งสมมติฐานแบบนั้นมันใช้ไม่ได้กับทุกกรณีนะครับ (จริงๆแล้วจะบอกว่าแทบใช้ไม่ได้เลยด้วยซ้ำ) ก็เพราะว่าปัญหามันเกิดตอนที่เราเอาส่วนเล็กๆมารวมกันนี่แหละ ความผิดพลาดตรงนี้เรียกว่า Interface error ซึ่งเกี่ยวข้องกับความไม่ถูกต้องของตัวแปรอะไรต่างๆที่อยู่นอกส่วนงานแต่ถูกเรียกใช้โดยส่วนงานของเรา ผมขอยกตัวอย่าง Interface error ขึ้นมาเพื่อให้เพื่อนๆเห็นภาพที่ชัดเจนขึ้นนะครับ (ข้อมูลข้างล่างถูกรวบรวมโดย Perry และ Evangelist)
ประเภทของ Interface และ Interface Errors
Inadequate Functionality
แปลง่ายๆว่า Module ของเราทำงานได้ไม่ครบตามที่คาดหวังไว้ส่งผลให้คนที่มาเรียกใช้งาน Module เราทำงานที่ต้องการไม่ได้ เช่น Module เราไม่มีส่วนการจัดการการจ่ายเงินผ่านบัตร Mastercard แบบนี้ตอนเทสก็จบเห่เลยครับ
Changes in Functionality
ปัญหานี้เกิดจากการเปลี่ยนแปลงรายละเอียดบางอย่างใน Module ของเรา แต่ไม่ได้มีการเปลี่ยนแปลง Module อื่นๆที่มีความสัมพันธ์กันให้เหมาะสม เช่น อยู่ดีๆเพื่อนเราเปลี่ยนจำนวน parameter ของ Module การเช่าหนังสือจาก 4 ตัวเป็น 5 ตัว แล้วไม่แจ้งเราที่เป็นคนเรียกใช้ (Caller) แบบนี้เมื่อเอาทั้งสองส่วนมารวมกันก็เทสไม่ผ่านครับ
Misuse of Interface
ปัญหานี้ก็คือการที่ Caller เรียกใช้ Module อื่นๆอย่างผิดวิธี คำว่าผิดก็ตีความได้หลายแบบครับ เช่น ส่ง parameter ไม่ครบ หรือส่ง parameter ผิดประเภทและผิดลำดับ เป็นต้น ตัวอย่างก็คล้ายๆข้อบนเลย
Data Structure Alteration
ถ้าจะพูดถึงปัญหานี้ให้ Developer เข้าใจง่ายๆก็คือเรื่องของ Buffer size ไม่พอครับ เช่น ผมเป็นคนเขียนโค๊ดในส่วนการค้นหาลูกค้าโดยสร้าง Array ที่เก็บข้อมูลลูกค้าไว้ขนาด 512 แต่พอเอาเข้าจริงจำนวนลูกค้ามีมากกว่านั้นครับ แบบนี้ก็เกิดปัญหา Array Index Out Of Bound ขึ้นมา
Inadequate Error Processing
ปัญหานี้เกิดขึ้นเมื่อ Module ที่ถูกเรียกใช้ส่ง Error code คืนกลับให้ Caller แต่ Caller เอา Error นั้นไปประมวลผลต่ออย่างไม่ถูกต้อง เช่น ถ้าในกรณีที่ค้นหาชื่อลูกค้าไม่เจอ (เพราะ search criteria ไม่ตรง) ผมก็ส่ง Error code ที่ว่า “Record not found” กลับไปให้ Module ของเพื่อนผม แต่เพื่อนผมลืมแสดง Error code นี้ที่หน้าจอซึ่งอาจจะสร้างความสับสนให้กับผู้ใช้งานว่า เออ ตกลงว่าหาไม่เจอ หรือว่าระบบเจ๊งไปแล้วกันแน่
Inadequate Interface Support
ปัญหานี้ก็คือ Module ที่ถูกเรียกทำงานเพื่อตอบสนองความต้องการของคนเรียกได้ไม่เพียงพอ เช่น Module ที่ใช้ออกใบเสร็จรับเงินคิดว่าเค้าสามารถคิดเงินเป็นสกุลดอลล่าร์ได้ แต่เราคนเขียน Module การคำนวณค่าเช่าหนังสือไม่ได้เตรียมส่วนการแปลงสกุลเงิน (currency converter) ไว้ให้ พอมีการเรียกใช้งาน Module ของเรา เพื่อนเราก็ไม่ได้ผลตามที่เค้าต้องการ เป็นต้น
ครับ นี่เป็นเพียงตัวอย่างส่วนหนึ่งที่ยืนยันว่า การที่เราทำ Unit test ผ่านหมดไม่ได้เป็นการรับประกันได้เลยว่าเมื่อนำ Module เล็กๆมารวมกันแล้วจะไม่มีปัญหาเกิดขึ้น ถึงตรงนี้เพื่อนๆคงจะเห็นความสำคัญของ Integration test มากขึ้นแล้ว จากประสบการณ์ของผมเอง คนที่รับผิดชอบทำ Integration test ก็ควรจะเป็น Developer เพราะมีความใกล้ชิด เข้าใจและเชี่ยวชาญในการออกแบบและการเขียนโค๊ดมากที่สุดครับ
Integration Testing Technique
Incremental
มีเทคนิคหลายรูปแบบให้เราเลือกใช้ในการทำ Integration testing แต่ที่ผมใช้อยู่ (และคิดว่าเหมาะสมที่สุดจากประสบการณ์) ก็คือเทคนิค Incremental ครับ โดยสรุปก็คือ ค่อยๆทำ Integration testing ไปเรื่อยๆทีละนิดหลังจากที่เราทำ Unit testing ของ Module ต่างๆเสร็จแล้ว มองอีกมุมก็คล้ายๆทำเป็นรอบ (Cycle) ไปครับ เพื่อนๆลองดูตัวอย่างจากรูปครับ

ในแต่ละรอบ เราค่อยๆทำ Unit testing แล้วต่อด้วย Integration testing ไปเรื่อยๆ เมื่อเจอบั๊กก็ให้ Developer แก้ทันที เมื่อเรียบร้อยแล้วก็ค่อยเริ่มรอบใหม่ๆต่อไปเรื่อยๆจนครบสมบูรณ์ทั้งระบบ ซึ่งตรงนั้นก็จะพร้อมส่งงานของเราให้ QA ไปทำ System testing แล้วหละครับ
System Testing
เอาล่ะครับ หลังจากทำ Integration testing จนเสร็จสมบูรณ์แล้ว ต่อไปในฐานะ Developer เราก็ส่งมอบภาระอันใหญ่หลวงให้ทาง QA ช่วยทำต่อได้แล้วหละครับ QA ต้องทำอะไร? งานหลักของเค้าเลยก็คือ System testing ครับ
ความหมายที่เข้าใจง่ายๆก็คือ System testing เป็นกระบวนการทดสอบระบบของเรา (อีกแล้ว) ว่าทำงานได้ตาม Requirement ที่ระบุไว้หรือไม่ครับ
Black Box Testing
เพื่อนๆน่าจะเคยได้ยินคำนี้กันมาบ้างแล้วนะ ครับ Black box testing ก็เป็นอีกหนึ่งเทคนิคสำหรับ Software testing ที่มีมุมมองต่างไปจาก White box testing ซึ่งจะเน้นการทดสอบที่ละเอียดและเป็นไปตามโค๊ดที่เราเขียนไว้ แต่สำหรับ Black box testing นั้น เราจะทำการทดสอบว่าระบบของเราทำงานได้ตาม Requirement หรือ Specification ที่กำหนดไว้รึเปล่า โดยที่เราไม่ต้องรู้ว่าการทำงานภายในของระบบเป็นอย่างไร ที่เราสนใจก็แค่ (1) Input รูปแบบต่างๆ (2) Output ที่ควรจะเป็น และ (3) System environment ของการทดสอบแต่ละครั้งครับ ข้อดีของเทคนิคนี้ก็คือ
- ไม่มีความลำเอียงเพราะคนเขียนโค๊ด (Developer) กับคนทดสอบ (QA) เป็นคนละคนกัน
- คนทำ ไม่ต้องมีความรู้เกี่ยวกับการเขียนโปรแกรมในระดับลึก
- การ ออกแบบ Test case สามารถทำได้เลยหลังจากทำ Requirement specification เสร็จ
ประเภทของ System Testing
เวลาทำ System testing นั้น QA ควรคำนึงถึงหลายเรื่องเพื่อเป็นการยืนยันได้อย่างมั่นใจว่างานของเราตอบสนองความต้องการของลูกค้าได้ครบทุกด้านจริงๆ ผมขอยกตัวอย่างบางเรื่องที่ QA ต้องสนใจให้ดูกันครับ
Basic test
ก็ตรงตามชื่อครับ การทดสอบเบื้องต้นซึ่งตามปกติแล้วก็จะประกอบไปด้วยการทดสอบการติดตั้งระบบ (System installation) การตั้งค่าระบบ (System configuration) และการเริ่มใช้งานระบบ (System operation) ครับ อันนี้เป็น Test case แรกๆที่ทุก Project ต้องมีเลยหละครับ
Functionality test
ส่วนนี้ก็เป็นการทดสอบว่าระบบของเราทำงานได้ครบถ้วนตามความต้องการของลูกค้าหรือไม่ ทุกอย่างที่มีระบุไว้ในสัญญาหรือ Requirement Traceability Matrix จะต้องถูกทดสอบทั้งหมดครับ เช่น สร้าง/ลบ user ได้ ค้นหาหนังสือได้ เช่าหนังสือได้ และอื่นๆอีกมากครับ
Robustness test
อันนี้เป็นการทดสอบว่าระบบเรามีความสามารถในการจัดการกับความผิดพลาดที่เกิดขึ้นได้ดีแค่ไหน ตัวอย่างนะครับ ระบบเรามีการจัดการกับ input ที่ผิดประเภทอย่างไร เช่น กรอกตัวอักษรลงไปในช่องที่รับข้อมูลเบอร์โทรศัพท์ ระบบป้องกันอย่างไร? หรือว่าเจ๊งไปเลย (อันนี้แย่นะ) หรือทดสอบว่าถ้ามีคนเปิดใช้งานระบบอยู่แล้ว ให้อีกคนไปดึงสาย LAN ออก ระบบเราจะจัดการยังไง? ระบบเรากู้ข้อมูลขึ้นมาได้มั้ย ได้ระดับไหน หรือว่าทำแค่นี้แล้วฐานข้อมูลเจ๊งไปเลย (อันนี้แย่กว่าอีก) เราจะมองว่าเป็น Negative test ก็ได้เหมือนกันครับ
Interoperability test
เป็นการทดสอบการทำงานร่วมกับระหว่างระบบเรากับผลิตภัณฑ์อื่นๆ (Third-party products) ทั้งหลายซึ่งรวมถึงทั้ง Hardware และ Software ครับ เช่น ใน Constraint ของระบบระบุว่าต้องใช้งานอยู่บนเครื่อง HP ProLiant DL100 โดยมี SUSE Linux Enterprise 11 เป็น Operating System มี Apache-tomcat 6.x เป็น Web server และ Oracle 11g เป็น Database เราก็ต้องทดสอบให้ครอบคลุมครับว่าระบบเราทำงานกับ Third-party เหล่านี้ได้อย่างสมบูรณ์
ข้อมูลที่ช่วยแนะนำแนวทางให้กับเราได้นอกจาก Requirement Traceability Matrix แล้วก็จะมี Infrastructure Architecture ด้วยครับ (จำได้กันรึเปล่า?) เพื่อนๆจะเห็นว่าถ้าเรามีการออกแบบโครงสร้างด้าน Infrastructure ที่ชัดเจน QA ก็จะรู้ว่าจะต้องเตรียมอะไร อย่างไรเพื่อทำการเทสครับ
งานนี้ค่อนข้างหนักทีเดียวครับ ยิ่งถ้าเราต้อง Support หลาย OS หลายเวอร์ชั่น Oracle ยิ่งจะทำให้เราต้องมีการวางกลยุทธ์การเทส (Test strategy) อย่างรอบคอบที่สุดครับ
Performance test
เป็นการทดสอบประสิทธิภาพในด้านต่างๆของระบบเราครับ เช่น ความเร็วที่ใช้ในการทำงานแต่ละงาน ความสิ้นเปลืองทรัพยากรของเครื่อง (CPU/Memory consumption rate) เป็นต้น ข้อมูลตรงนี้เราหาได้จาก Nonfunctional Requirements: Performance Requirements ครับ
Scalability test
เป็นหนึ่งในมุมมองด้าน Performance ของระบบครับ แต่จะเน้นไปในส่วนที่ว่าระบบเรารองรับการขยายตัวของข้อมูล จำนวนผู้ใช้ หรือจำนวน Hardware ได้ดีแค่ไหน ตัวอย่างเช่น ระบบเรารองรับผู้ใช้ซัก 10,000 คนได้มั้ย? ระบบเรารองรับการเข้าใช้งานพร้อมกันซัก 500 คนได้มั้ย? หรือว่าถ้าเราจะเพิ่มปริมาณของ Server จากที่มีอยู่แค่เครื่องเดียว ไปเป็นสามเครื่องจะทำได้มั้ย? เป็นต้นครับ
Stress test
นี่ก็อีกหนึ่งในมุมมองด้าน Performance ของระบบ แต่เป็นการเทสที่แปลกนิดนึงคือเราตั้งใจไว้เลยครับว่า เอาล่ะ วันนี้เราจะทำทำให้ระบบพังกันนะ แล้วเราก็ลุยเลยครับ เช่น อัดจำนวน user เข้าไปในฐานข้อมูลซัก 100,000 คน … เจ๊งปะ? ยังหรอ งั้นเอาเข้าไปอีกเป็น 150,000 คน … อ่าว เจ๊งล่ะ ระบบไม่ตอบสนองหรือว่าทำงานช้าลง ตรงนี้สำคัญครับ เราต้องบันทึกข้อมูลไว้ด้วยว่า มันเจ๊งที่จำนวนลูกค้าเท่าไรเพื่อหนึ่งเอาไปเทียบดูกับ Requirement ว่าระบบเราทำตามนั้นได้จริงๆนะ (กรณีนี้ผ่านเพราะ Requirement บอกว่ารองรับ user ได้อย่างน้อย 10,000 คน) และสองเอาไปเป็นข้อมูลในการเขียนเอกสารรับรองความสามารถของระบบครับว่า ถ้าลูกค้าที่ใช้ระบบเรามี user เกิน 120,000 คน (ตัวเลขสมมติ) จะทำให้ระบบตอบสนองช้าลงและอาจจะทำงานผิดพลาดนะ
Load and stability test
ก็ Performance อีกแหละครับ คราวนี้เรามาลองดูกันว่าระบบเรามีความเสถียรแค่ไหนกับการใช้งานแบบเต็มประสิทธิภาพ ตัวอย่างเช่น ใช้งานระบบด้วยลักษณะการทำงานคล้ายๆของจริง เช่น มี user ซัก 5,000 คน มีหนังสือในระบบซัก 1,500 เล่ม แล้วก็มีคนเข้าใช้งานพร้อมๆกันซัก 50 คน อะไรแบบนี้ครับ เรามาดูกันว่าระบบเราจะทำงานได้ราบรื่น รวดเร็ว และถูกต้องได้นานขนาดไหน
ใจเราก็อยากให้มันทำงานได้ตลอดไปใช่ปะครับ? ผมก็หวังแบบนั้น แต่ความจริงมักจะโหดร้ายเสมอ บางครั้งเราลองเล่นไปซัก 2 ชั่วโมงอาจจะเกิด Out of Memory หรือ Database connection full ขึ้นมาก็ได้ แบบนี้เราก็ต้องมานั่งดูครับว่ามันเป็นที่เราเขียนโค๊ดไม่ดีรึเปล่า? หรือว่า Hardware ที่เราใช้มันมีประสิทธิภาพไม่สูงพอจะรองรับการทำงานในสถานการณ์ปกติได้
Reliability test
ก็เป็นการทดสอบที่มองว่าระบบเราสามารถเปิดให้บริการกับผู้ใช้ได้นานต่อเนื่องแค่ไหน การเทสก็ไม่ยาก เราก็แค่เปิดระบบทิ้งไว้เฉยๆเลยครับ ว่างๆก็เข้ามากดๆเล่นๆดูซักหน่อย แล้วดูว่าผ่านไป 1 อาทิตย์ระบบเรามีอะไรเสียหายบ้างรึเปล่า ถ้าไม่มีปล่อยไป 2 อาทิตย์ 3 อาทิตย์ อะไรแบบนี้ครับ ลองดูว่าถ้าทิ้งไว้นานๆ ระบบเรามันจะเจ๊งไปเองรึเปล่า … อันนี้เทสไม่อยากแต่ถ้าเจ๊งขึ้นมาหละ หาสาเหตุกับแก้ปัญหาไม่ง่ายเลยนะครับ
Regression test
อันนี้สำคัญมากครับ เป็นการทดสอบดูว่าระบบเราเนี่ยะมันทำงานได้ถูกต้องตามปกติอยู่ตลอดเวลาหรือไม่ สาเหตุที่หนึ่งที่เราต้องมีการทดสอบแบบนี้ก็เพราะเวลาเราทำ Integration testing แบบ Incremental นั่นคืองานค่อยๆเพิ่มขึ้นมา งานที่เพิ่มขึ้นมาไม่ได้ไปทำให้งานเก่าที่เคยใช้งานได้ดีเสียหายนะ และสองเรามองไปในอนาคตนิดนึงว่าถ้าระบบเราจะมีการเพิ่ม Feature ต่างๆขึ้นมา เจ้า Feature ใหม่ๆเนี่ยะต้องไม่ไปทำให้ของเก่าเค้าเสียหายไปด้วยนะ … นี่แหละครับ Regression test ซึ่งผมคิดว่าจำเป็นมากๆที่ต้องทำก่อนส่งมอบระบบให้กับลูกค้า
Documentation test
อันนี้ไม่ใช่การทดสอบแต่เป็นการตรวจสอบว่าเอกสารต่างๆที่เกี่ยวกับระบบของเรา เช่น User manual หรือ Installation guide นั้นเขียนอย่างถูกต้องและครบถ้วน ไม่ใช่ว่าเราไปติดตั้งระบบตามขั้นตอนที่เขียนไว้ใน Installation guide แล้วทำไม่ได้ ไม่สำเร็จ อ่านไม่รู้เรื่อง แบบนี้ไม่ได้นะครับ
เพื่อนๆจะเห็นว่างาน QA ไม่ใช่น้อยๆเลยถึงแม้จะดูเหมือนว่ามีบทบาทสำคัญอยู่เฉพาะในช่วงที่ทำ System testing ยิ่งถ้าต้องทำอะไรที่เกี่ยวข้องกับ Performance test แล้วด้วยยิ่งเหนื่อยหนัก ตัวอย่างง่ายๆเลยครับ Stress test ที่ว่าให้สร้าง user 100,000 คน แบบนี้มานั่งทำทีละคนจะไหวมั้ยครับ เป็นลมพอดี ประเด็นของผมมีอยู่ว่าถ้าเราเลือกได้และพร้อม เราควรพิจารณาใช้ Automated testing และเทคนิคอื่นๆเข้ามาช่วยครับ
Acceptance Testing
หลังจากที่เราทำ System testing เสร็จ เราก็มั่นใจแล้วหละว่าระบบของเราทำงานได้ยอดเยี่ยมพร้อมส่งมอบให้ลูกค้า … และเก็บเงินงวดสุดท้าย แต่ลูกค้าเค้าจะคิดเหมือนเรารึเปล่าหละครับ การที่เราบอกว่าเราทดสอบระบบแล้วเรียบร้อย ลูกค้าอาจจะไม่เชื่อหรือไม่แน่ใจ 100% ว่าเค้ากำลังจะจ่ายเงินให้กับของดีมีคุณภาพและตรงตามความต้องการของเค้าจริงๆหรือไม่ เมื่อลูกค้าไม่แน่ใจ ลูกค้าก็ขอทดสอบระบบเองอีกครั้งก่อนรับมอบงาน คิดไปก็คล้ายๆเวลาเราจะซื้อบ้านซักหลังนะครับ ช่างปูน ช่างไม้ ช่างประปา ช่างไฟ ช่างสี สารพัดช่างยืนยัน นั่งยัน นอนยันว่างานเรียบร้อยดีแล้วครับพี่ … เราเชื่อเค้าปะครับ? ไม่หรอก จริงมั้ยครับ บ้านหลังนึงเป็นล้านไม่เห็นด้วยตาไม่สัมผัสด้วยตัวเองไม่ได้หรอกครับ นี่แหละครับที่มาของ Acceptance testing
Acceptance testing หรือ User acceptance testing (UAT) เป็นการทดสอบครั้งสุดท้ายก่อนส่งมอบงานว่าระบบนั้นทำงานได้ตามมาตรฐาน (Acceptance criteria) ของลูกค้าหรือไม่ซึ่งจะเป็นการช่วยลูกค้าให้ตัดสินใจรับหรือไม่รับระบบนี้ครับ โดยทั่วไปแล้วเจ้า Acceptance criteria นั้นจะถูกเขียนจากความคาดหวังหรือมาตรฐานของลูกค้าเองและการทดสอบก็จะทำโดยตัวลูกค้าเองด้วย (จริงๆก็เป็นไปได้ที่ลูกค้าจะไปว่าจ้างอีกบริษัทหนึ่งให้มาทำ Acceptance testing ในนามของลูกค้าครับ)
สำหรับตัวลูกค้าเองนั้นคำถามสำคัญก่อนเขียน Acceptance criteria ก็คือระบบต้องทำอะไรได้หรือไม่ได้บ้างเพื่อที่จะผ่านการทดสอบครั้งนี้? ซึ่ง Acceptance criteria นั้นต้องประเมินผลได้และวัดปริมาณได้ แบบที่จะเขียนว่า “ระบบต้องค้นหา user ได้เร็ว” ไม่เอานะครับ คำว่า “เร็ว” คือเร็วแค่ไหน? ในสถานการณ์ยังไง? ถ้าตอบไม่ได้ก็ทดสอบระบบไม่ได้ครับ
ประเภทของ Acceptance Criteria
สำหรับตัวเราเองในฐานะคนพัฒนาระบบ เราก็ควรจะรู้ว่าลูกค้าเค้าจะทดสอบอะไรบ้างในช่วง Acceptance Criteria เพื่อที่จะหาทางป้องกันด้วยวิธีต่างๆให้ระบบสามารถตอบสนองกับสิ่งเหล่านั้นได้อย่างสมบูรณ์ เรามาดูกันครับว่า ในมุมมองลูกค้าเค้าจะมองอะไรกันเป็นพิเศษ
Functional correctness and completeness
จุดนี้ก็จะดูคล้ายๆกับ System testing ครับว่าระบบเราทำงานได้ถูกต้องและครบถ้วนตามที่ Requirement เขียนไว้หรือไม่
Accuracy
ก็จะดูว่าระบบทำการประมวลผลอะไรต่างๆได้อย่างถูกต้อง 100% หรือเกือบ 100% (ขึ้นอยู่กับ Acceptance criteria) หรือไม่ โดยทั่วไปจะเน้นไปที่ส่วนการทำงานที่มีการคำนวณหรือวิเคราะห์ข้อมูลที่เป็นตัวเลขต่างๆ เช่น คำนวณราคาเช่าหนังสือ เป็นต้น
Data integrity
ลูกค้าจะดูว่าข้อมูลที่ถูกเก็บอยู่ในฐานข้อมูลนั้นอยู่ในสถานะที่ถูกต้องสมบูรณ์อยู่ตลอดเวลาซึ่งเป็นการตรวจสอบการออบแบบหรือเขียนโปรแกรมในระดับที่ค่อนข้างลึกเลยครับ เช่น ถ้าผมลบ user คนหนึ่งทิ้งไป ข้อมูลของคนๆนี้จะต้องหายเกลี้ยงออกไปจากตารางทุกตารางที่มีอยู่ในฐานข้อมูลนะ ไม่ใช่ว่าประวัติการเช่าหนังสือของเค้าก็ยังอยู่ หนังสือที่เค้าจองคิวไว้ก็ยังอยู่ แบบนี้เกิด Data corruption แล้วครับ ปัญหานี้มีความสำคัญต่อลูกค้าอย่างมากครับ
Data conversion
ก็เป็นการทดสอบดูว่าการเปลี่ยนแปลงประเภทหรือรูปแบบข้อมูลไปมาทำได้ถูกต้อง เช่น ถ้าลูกค้าต้องการให้ระบบนำข้อมูล user ทั้งหมดออกมาอยู่ในรูปแบบ CSV เพื่อที่ลูกค้าจะเอาไปเป็น Input ให้กับระบบการวิเคราะห์และวางแผนการตลาด ระบบเราทำได้อย่างถูกต้องหรือไม่? เป็นต้นครับ
Backup and recovery
ระบบใหญ่ทั่วไปแล้วต้องมีความสามารถในการ Backup และ Recovery ที่เชื่อถือได้ครับ ตรงนี้ก็จะเป็นจุดสำคัญที่ลูกค้าจะทดสอบ ซึ่ง Acceptance criteria ตรงนี้นอกจากจะทำการ Backup และ Recovery ได้อย่างถูกต้องแล้ว ลูกค้าจะดูด้วยว่ากระบวนการทั้งหมดใช้เวลาไม่นานจนเกินไป และระดับความสมบูรณ์ของข้อมูลที่ Recover ได้ด้วยครับ
Usability
อันนี้เกี่ยวข้องกับความรู้สึกของลูกค้าอยู่ซักหน่อยกับคำถามที่ว่า “ระบบนี้ใช้งานง่ายแค่ไหนและใช้เวลาในการเรียนรู้ที่จะใช้งานได้นานหรือไม่?” Acceptance criteria เพิ่มเติมก็จะมีเช่น ระบบยืดหยุ่นต่อการใช้งานมากแค่ไหน การตั้งค่าต่างๆของระบบยากมั้ย หรือมีระบบช่วยเหลือ (help) ที่ดีหรือไม่? เป็นต้น
Performance
จุดนี้ก็สำคัญสำหรับลูกค้าอย่างมากครับ เรื่อง Performance ของระบบทั้งหลายแหล่ ลูกค้าจะทดสอบในหลายๆมุมมองคล้ายๆกับที่เราทำใน System testing เลย เช่น Performance Stress Reliability and Availability และอื่นๆครับ ผมขอไม่พูดซ้ำในจุดนี้นะครับ
Documentation
สุดท้ายก็เรื่องเอกสารครับ ลูกค้าจะลองอ่านดูว่า อ่านง่าย เข้าใจง่าย มีรูปภาพประกอบคำอธิบายที่ชัดเจน ใช้ภาษาถูกต้องตามหลักไวยกรณ์หรือไม่ เป็นต้น
System Installation
หลังจากจบการ Testing แล้ว กระบวนการสุดท้ายของ Software development life cycle ก็คือ System installation ซึ่งโดยทั่วไปแล้วก็จะเป็นหน้าที่ของเรา (อาจจะเป็นทีม Field engineer) ที่จะไปติดตั้งระบบทั้ง Hardware และ Software ให้กับลูกค้าครับ
ผมเองไม่มีประสบการณ์ตรงกับกระบวนการนี้เท่าไรครับ ผมขออนุญาตไม่ลงรายละเอียดนะครับ กลัวจะเขียนผิดทำให้เพื่อนๆเข้าใจอะไรผิดๆไปด้วย
สรุปภาคห้า
ภาคนี้เน้นหนักไปที่การทดสอบระบบแบบต่างๆซึ่งเป็นหน้าที่รับผิดชอบของทั้ง Developer QA หรือแม้แต่ตัวลูกค้าเองครับ เพื่อนๆจะเห็นว่าผมนำเสนอข้อมูลที่เป็นทฤษฎีซะเป็นส่วนใหญ่เพราะว่าการทดสอบที่จะเกิดขึ้นนั้นขึ้นอยู่กับระบบของใครของมันจริงๆครับ เช่น ระบบเช่าหนังสือออนไลน์ของเราไม่จำเป็นต้องการ Reliability ที่สูงเท่าระบบโอนเงินธนาคารหรือระบบคาดการณ์แผ่นดินไหว เป็นต้น ผมก็หวังว่าทฤษฎีที่สำคัญของการทดสอบระบบเหล่านี้จะช่วยเป็นแนวทางให้เพื่อนๆได้นำไปต่อยอดให้เหมาะสมกับงานอีกทีครับ
การเดินทางนี้ช่างยาวไกลยิ่งนัก ทั้งคนอ่านและคนเขียน … ผมเองก็เขียนมาจนเพิ่งรู้สึกตัวว่า Project เราเกือบเสร็จแ้ล้วนะครับเนี่ยะ งานที่เป็น Software development นั้นเสร็จสมบูรณ์แล้ว แต่ผมจะขอปิดท้ายเรื่องที่เกี่ยวกับ Project management อีกนิดนึงในบทความหน้าซึ่งจะเกี่ยวกับกระบวนการที่เราควรทำเมื่อ Project (เกือบ)เสร็จแล้วครับ
ผมเข้าใจว่ามี QA อ่านบทความของผมอยู่บ้างเหมือนกัน … มีความคิดเห็นเพิ่มเติมอะไรบ้างมั้ยครับ