การทดสอบมีอยู่หลายชนิดหรือหลายแบบขึ้นอยู่กับวัตถุประสงค์ของการทดสอบ เริ่มจาก unit test เป็นการทดสอบส่วนย่อยๆของโปรแกรม เช่น เมธอด ดังนั้นการทำ unit test จึงจะเกี่ยวข้องกับส่วนของโปรแกรมที่มีขนาดเล็ก จำนวนบรรทัดไม่มากขนาดเป็นแสนเป็นล้านบรรทัด ถ้ามองในมุมของคุณสมบัติที่จำเป็นของเงื่อนไขการทดสอบ unite test จะรวดเร็ว (fast) สามารถระบุส่วนที่บกพร่องของโปรแกรมได้ง่าย (Isolate) unit test เป็นชนิดของการทดสอบที่เป็นพื้นฐานที่สุดในชุดการทดสอบ 

     เมื่อเราทดสอบผ่านในส่วนย่อยๆของโปรแกรมแล้ว เราจะทำสอบการทำงานร่วมกันของแต่ละส่วนหรือทดสอบในภาพที่กว้างมากขึ้น รวมถึงการทดสอบการทำงานร่วมกับระบบอื่นเรียกว่า integtation test ถ้ามองในมุมของคุณสมบัติที่จำเป็นของเงื่อนไขการทดสอบ integration test จะยังถือว่าเร็วและสามารถระบุส่วนที่บกพร่องของโปรแกรมได้ง่ายอยู่ เราสามารถแบ่งเงื่อนไขในการทดสอบออกมาเป็นชุดเล็กๆเรียกว่า smoke test เช่น 10-12 กรณีจากทั้งหมด 1000 กรณี เพื่อใช้ทดสอบให้แน่ใจว่าระบบสามารถทำงานได้ก่อนทำ integration test เต็มรูปแบบ

     ในมุมของผู้ใช้งานย่อมต้องการทดสอบก่อนการใช้งานเพื่อให้แน่ใจว่าได้ของตามที่ต้องการเช่นเดียวกัน เราเรียกการทดสอบชนิดนี้ว่า acceptance Test  โดยในการทดสอบจะไม่ได้เป็นแบบอัติโนมัติเหมือนการทดสอบในมุมมองของทีมพัฒนา การทดสอบจะใช้ชุดข้อมูลของจริงในการทดสอบ และทำการทดสอบในสิ่งแวดล้อมของผู้ใช้งาน ดังนั้นการทำ acceptance test จะค่อนข้างช้าเพราะจะทำเหมือนกับการใช้งานจริง การทำ acceptance test จะมีคุณสมบัติ simulate users

     หลังจากผ่านการทดสอบต่างๆมาแล้ว จะเป็นการทดสอบในภาพรวมทั้งหมดเรียกว่า system test โดยใช้ข้อมูลตัวอย่างเพื่อให้แน่ใจว่าระบบทั้งหมดทำงานร่วมกันได้ ซึ่งต่างจาก integration test ที่จะเป็นส่วนย่อยๆของการทำงานร่วมกัน และต่างจาก acceptance test ตรงที่ system test จะทำโดยทีมพัฒนา ใช้ข้อมูลจำลอง มักทำต่อเนื่องรวดเดียวไปจนจบ และทดสอบในสิ่งวแดล้อมของทีมพัฒนา 

     ถ้าเราเปรียบเทียบระหว่าง unit test และ system test จะเห็นว่า unit test จะทำงานเร็วกว่ามากเพราะทดสอบเป็นส่วนย่อยๆ เช่น ระดับเมธอด ซึ่งเป็นการทดสอบกับส่วนของโปรแกรมที่ไม่ใหญ่มาก ไม่มีไลบรารี่หรือระบบงานอื่นมารบกวน ในขณะที่ system test จะใช้เวลามากกว่าเพราะเป็นการทดสอบในภาพรวมของทั้งระบบงาน ในมุมมองของความน่าเชื่อถือ unit test จะน่าเชื่อถือกว่าเพราะเป็นการทดสอบส่วนของโปรแกรมนั้นๆเท่านั้น ซึ่งเราสามารถควบคุมสิ่งแวดล้อมของการทดสอบได้ ในขณะที่ system test จะมีตัวแปรอื่นเข้ามาเกี่ยวข้อง เช่น ไลบรารี่อื่น ระบบงานอื่น เว็บเซอร์วิสที่เชื่อมต่อ การเชื่อมต่อกับเครือข่าย เป็นต้น ซึ่งทั้งหมดนี้มีผลให้เกิดปัญหาได้ทั้งนั้น ดังนั้นในการทำ system test เป็นไปได้ที่จะพบข้อผิดพลาดมากขึ้นตามจำนวนรอบการทดสอบที่เพิ่มมากขึ้น ในมุมมองของการระบุข้อผิดพลาด unite test จะง่ายกว่าและแม่นยำกว่าเนื่องจากจำนวนบรรทัดโปรแกรมที่ต้องทดสอบน้อยกว่า ในขณะที่การทำ system test จะระบุจุดที่บกพร่องได้ยากกว่าเพราะเป็นการทดสอบทั้งระบบ แต่ในมุมของการทดสอบในระดับผู้ใช้งาน unit test ไม่ตอบโจทย์นี้เนื่องจากในการเป็นการทดสอบเพียงส่วนย่อยๆในขณะที่ในการใช้งานจริงผู้ใช้งานจะใช้หลายๆส่วนของโปรแกรมในการทำงานร่วมกัน ดังนั้น system test จะตอบโจทย์มากกว่า จะเห็นว่า unit test ตอบโจทย์เรื่องคุณสมบัติที่จำเป็นของเงื่อนไขการทดสอบมากกว่า แต่ก็ไม่สามารถเป็นตัวแทนของการทดสอบในระดับการใช้งาน ดังนั้นในการทดสอบ เราควรใส่ใจกับการทำ unit test ให้มากแต่ก็ต้องทำ system test บ้างเพื่อให้เห็นภาพรวมว่าเป็นไปตามที่ผู้ใช้งานต้องการหรือไม่