ในการพัฒนาซอฟต์แวร์หลีกเลี่ยงไม่ได้ที่จะมีข้อผิดพลาดเกิดขึ้น โดยเฉพาะในโครงการพัฒนาซอฟต์แวร์ขนาดใหญ่ที่มีความซับซ้อน ข้อผิดพลาดที่เกิดขึ้นมีตั้งแต่เพียงแค่ก่อความรำคาญไปจนถึงก่อให้เกิดความเสียหายขนาดใหญ่หรือเป็นอันตรายถึงชีวิต ดังนั้นเราจึงต้องทดสอบโปรแกรมเพื่อให้มั่นใจว่าโปรแกรมของเราทำงานถูกต้องตามสเปกที่กำหนดไว้
ในการทดสอบเราจะทดสอบด้วยวิธีอัตโนมัติซึ่งถูกใช้ในการทดสอบโครงการพัฒนาซอฟต์แวร์ขนาดใหญ่ การทดสอบด้วยวิธีอัตโนมัติเป็นการค้นหาข้อผิดพลาดซ้ำไปซ้ำมาด้วยวิธีการที่เชื่อถือได้ แต่กระนั้นก็ยังมีโอกาสที่ยังมีข้อผิดพลาดหลุดลอดออกไปได้ซึ่งเกิดขี้นได้จากหลายสาเหตุขึ้นอยู่กับชนิดของผลิตภัณฑ์ ทีมงาน กระบวนการ หรือขอบเขตของการพัฒนา สาเหตุหลักๆของข้อผิดพลาดมักจะมาจากการบอกความต้องการไม่ถูกต้องหรือไม่ครบถ้วน ดังนั้นเราต้องใส่ใจการทำสเปคให้มาก ส่วนสาเหตุอื่นๆก็เช่นการละเลยหรือแก้ไขความต้องการซึ่งโดยมากจะเกิดในขั้นตอนการพัฒนาตามความต้องการของทีมพัฒนาที่อาจจะถูกกดดันจากข้อจำกัดด้านเวลาซึ่งสิ่งที่ละเลยหรือแก้ไขอาจจะไม่ตรงกับความต้องการของลูกค้า หรือการออกแบบที่ไม่เหมาะสมในขั้นตอนการออกแบบภาพรวม (high level design) เมื่อออกแบบในรายละเอียด (low level design) ซึ่งสุดท้ายจะถูกนำไปเขียนเป็นโปรแกรมก็จะนำไปสู่ข้อผิดพลาด นอกจากนี้ยังมีเรื่องการละเลยการทดสอบซึ่งอาจจะเนื่องมาจากความรีบร้อนนำไปใช้งาน รวมถึงการไม่ปฏิบัติตามกระบวนการในการทำสเปคและกระบวนการอื่นๆก่อนหน้านี้
การทดสอบด้วยวิธีอัตโนมัติเป็นการทดลองใช้งานซอฟต์แวร์ด้วยข้อมูลขาเข้าและขาออกที่แตกต่างกัน เพื่อตรวจสอบพฤติกรรมของซอฟต์แวร์ว่าเป็นไปตามที่ต้องการ แต่การทดสอบด้วยวิธีอัตโนมัติก็ยังมีจุดอ่อนเพราะเราต้องกำหนดเงื่อนไขในการทดสอบโดยการพิจารณาพฤติกรรมทั้งที่ต้องการและไม่ต้องการได้จากสเปคเท่านั้น แต่ในการใช้งานจริงยังมีตัวแปรอื่นที่ก่อให้เกิดข้อผิดพลาดได้ เช่น ข้อมูลในการทดสอบไม่หลากหลายเท่าในการใช้งานจริง สิ่งแวดล้อมในการทดสอบไม่เหมือนกับที่จะใช้งานจริง ข้อจำกัดของสิ่งแวดล้อมที่ใช้งานจริงต่างกับที่ใช้ในการทดสอบ ถึงแม้ว่าเราต้องการทดสอบให้มากขึ้นแต่ในความเป็นจริงเราไม่สามารถทำได้อันเนื่องมาจากเวลาและงบประมาณที่จำกัดตามที่ตกลงกันไว้และในฐานะผู้พัฒนาถ้าเราไม่ส่งมอบงานเราก็ไม่ได้เงิน ดังนั้นสิ่งที่เราทำได้คือหาข้อผิดพลาดที่มีผลกระทบมากภายใต้เวลาและงบประมานที่มีสำหรับการทดสอบ แต่เนื่องจากเราไม่รู้ว่าจะเจอข้อผิดพลาดอะไรบ้าง เราจึงบอกไม่ได้ว่าข้อผิดพลาดอันไหนที่มีผลกระทบมากหรือน้อย เราจึงต้องใช้กระบวนการมาช่วยในการทดสอบ แต่กระบวนการในการทดสอบก็มีอยู่หลากหลายขึ้นอยู่กับชนิดของผลิตภัณฑ์และทีมงาน ดังนั้นเราต้อง (1) เลือกว่าเราต้องการทดสอบอะไร เพราะในโครงการขนาดใหญ่นั้นเป็นไปได้ยากที่เราจะทดสอบระบบทั้งหมด ดังนั้นเราจะเลือกทดสอบส่วนที่สำคัญที่สุด (2) กำหนดเงื่อนไขในการทดสอบ (test case) รวมถึงผลลัพธ์เพื่อเปรียบเทียบ (assertion) (3) ทำการทดสอบตามเงื่อนไขที่กำหนดซึ่งสามารถแบ่งออกเป็นหลายกรณี เช่น ทดสอบโดยนักพัฒนาก่อนที่จะส่งมอบ ทดสอบร่วมกับระบบอื่นหรือไม่ (4) ต้องแน่ใจว่าเราสามารถตรวจสอบผลลัพธ์จากการทดสอบ เช่น มีการบันทึกการทำงาน (log) ให้ตรวจสอบ หรือหากเป็นการทดสอบโดยนักพัฒนาเองต้องมีกระบวนการในการป้องกันไม่ให้ส่งมอบโปรแกรมหากทดสอบไม่ผ่านหรือไม่ (5) พิจารณาว่าการทดสอบที่ทำไปพอเพียงหรือไม่ที่จะทำให้เรามั่นใจในการส่งมอบโปรแกรมให้ผู้ใช้งาน เพราะเป็นไปได้ว่าเราอาจจะมีการลัดขั้นตอนในการทดสอบอยู่บ้าง
ในการทดสอบเราใช้ชุดของเงื่อนไขการทดสอบ (test case set) เพื่อประเมินพฤติกรรมของโปรแกรม โดยชุดของเงื่อนไขการทดสอบจะมีอยู่หลายชุด (test case suit) แบ่งออกเป็นกลุ่มๆตามความเกี่ยวข้องกัน ส่วนของโปรแกรมที่จะถูกประเมินโดยใช้เงื่อนไขในการทดสอบจะเรียกว่า CUT – code under test หรือ SUT – system under test สำหรับกลไกในการทดสอบแบ่งออกเป็นการทดสอบที่อิงตามรหัสโปรแกรม (white box testing) และการทดสอบที่อิงตามสเปค (black box testing)
การทดสอบที่อิงตามรหัสโปรแกรมจะเป็นการศึกษารหัสโปรแกรม (code) เพื่อให้เข้าใจว่าทำงานอย่างไรและสร้างเงื่อนไขการทดสอบที่สอดคล้องกับการทำงานของรหัสโปรแกรม ส่วนการทดสอบที่อิงตามสเปค (black box testing) จะเป็นสร้างเงื่อนไขการทดสอบตามสเปคเพราะเราไม่สามารถดูรหัสโปรแกรมแต่ละบรรทัดได้ สำหรับเงื่อนไขการทดสอบที่สร้างขึ้นมาจะต้องมีประสิทธิภาพคือสามารถตรวจจับข้อผิดพลาดได้ หากเงื่อนไขการทดสอบไม่สามารถแสดงข้อผิดพลาดหรือไม่สามารถตรวจจับข้อผิดพลาดได้ เงื่อนไขการทดสอบนั้นก็ไม่มีประโยชน์อันใด