ทำไม Cem Kaner พิจารณาการทดสอบที่ไม่เปิดเผยข้อผิดพลาดให้เสียเวลา?


15

สิ่งที่เกี่ยวกับการยืนยันการทำงานในการทดสอบเชิงบวกพิสูจน์ว่ามันทำงาน - ฉันควรจะพูดว่ามันเสียเวลา? แนวคิดแบบไหนที่อยู่เบื้องหลังคำพูดนี้?

การทดสอบที่ไม่สำเร็จเช่นการทดสอบที่ไม่พบข้อผิดพลาดนั้นเป็นการเสียเวลา

วิศวกรรมเว็บ: วินัยของการพัฒนาระบบการใช้งานเว็บ quoting เซมคเนอร์


2
ไม่ได้จริงๆ Kaner อ้างว่าโดยทั่วไปแล้วการทดสอบควรพบข้อบกพร่อง
John V

4
นั่นเป็นตำแหน่งทางวิชาการมาก Mr. Kaner และ Mr. Schrödingerจำเป็นต้องนั่งจิบกาแฟสักถ้วย
Blrfl

2
@Blrfl ปัญหาเฉพาะกับที่เป็นที่นายSchrödingerตาย โอ้รอ ... อืม ...
ikmac

1
ว่าคำสั่งโดยไม่มีบริบทเสียงโง่เมามัน ...
Rig

1
“ ยืนยันการทำงานในการทดสอบเชิงบวก” - นี่เป็นไปไม่ได้ คุณไม่สามารถพิสูจน์สิ่งที่ถูกต้องคุณสามารถพิสูจน์ได้ว่าผิด
Konrad Rudolph

คำตอบ:


37

ฉันเขียนซอฟต์แวร์ทดสอบคอมพิวเตอร์ส่วนใหญ่เมื่อ 25 ปีที่แล้ว ฉันชี้ไปที่หนังสือหลายเล่มที่ฉันคิดว่าล้าสมัยหรือผิดไป ดูhttp://www.kaner.com/pdfs/TheOngoingRevolution.pdf

คุณสามารถดูเพิ่มเติม (มุมมองปัจจุบัน แต่ไม่มีตัวชี้ชัดเจนกลับไปที่ TCS) ที่เว็บไซต์ของฉันสำหรับหลักสูตรการทดสอบซอฟต์แวร์กล่องดำ (วิดีโอและสไลด์ให้บริการฟรี), www.testingeducation.org/BBST

วัฒนธรรมการทดสอบในตอนนั้นเป็นสิ่งยืนยันอย่างมาก

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

ฉันคิดว่าความคิดเชิงยืนยันนั้นเหมาะสมสำหรับการทดสอบหน่วย แต่ลองจินตนาการถึงโลกที่การทดสอบระบบทั้งหมดเป็นการยืนยัน (สำหรับผู้ที่มีความแตกต่างโปรดตีความ "การทดสอบการรวมระบบ" และ "การทดสอบการยอมรับ" ซึ่งรวมอยู่ในข้อคิดเห็นของฉันในระบบ การทดสอบ) จุดประสงค์ของการทดสอบคือเพื่อยืนยันว่าโปรแกรมตรงตามข้อกำหนดของมันและวิธีการที่โดดเด่นคือการสร้างการทดสอบการถดถอยระดับระบบ (zillion หรืออย่างน้อยสองสามร้อย) ที่ทดสอบส่วนของข้อมูลจำเพาะกับพฤติกรรมของโปรแกรม (ฉันคิดว่าการยืนยันแบบเจาะจงเพื่อพฤติกรรมมีประโยชน์ แต่ฉันคิดว่ามันเป็นส่วนเล็ก ๆ ของวัตถุประสงค์ที่ใหญ่กว่า)

ยังคงมีกลุ่มทดสอบที่ดำเนินการในลักษณะนี้ แต่มันก็ไม่ใช่มุมมองที่โดดเด่นอีกต่อไป ย้อนกลับไปตอนนั้น ฉันเขียนอย่างเด่นชัดและดึงความแตกต่างที่คมชัดเพื่อให้ชี้ไปยังผู้ที่ได้รับการฝึกฝนอย่างต่อเนื่องในความคิดนี้ วันนี้ความแตกต่างที่คมชัดบางส่วน (รวมถึงที่ยกมาที่นี่) ล้าสมัย พวกเขาตีความผิดว่าเป็นการโจมตีในมุมมองที่ผิด

อย่างที่ฉันเห็นการทดสอบซอฟต์แวร์เป็นกระบวนการเชิงประจักษ์สำหรับการเรียนรู้ข้อมูลที่เกี่ยวข้องกับคุณภาพเกี่ยวกับผลิตภัณฑ์หรือบริการซอฟต์แวร์

การทดสอบควรออกแบบเพื่อเปิดเผยข้อมูลที่เป็นประโยชน์

ย้อนกลับไปโดยวิธีการที่ไม่มีใครพูดคุยเกี่ยวกับการทดสอบเป็นวิธีการเปิดเผย "ข้อมูล" ย้อนกลับไปการทดสอบนั้นใช้สำหรับ (บางรุ่น ... ) ค้นหาข้อบกพร่องหรือ (บางรุ่น ... ) กำลังตรวจสอบ (ตรวจสอบ) โปรแกรมกับข้อกำหนด ฉันไม่คิดว่าการยืนยันว่าการทดสอบมีไว้เพื่อเปิดเผยข้อมูลที่เป็นประโยชน์เข้ามาในคำศัพท์การทดสอบจนกระทั่งศตวรรษนี้

ลองนึกภาพการทดสอบการให้คะแนนในแง่ของค่าข้อมูลของพวกเขา การทดสอบที่น่าจะสอนเราบางอย่างที่เราไม่รู้เกี่ยวกับซอฟต์แวร์จะมีค่าข้อมูลสูงมาก การทดสอบที่มีแนวโน้มมากที่จะยืนยันบางสิ่งบางอย่างที่เราคาดว่าจะได้รับและแสดงให้เห็นแล้วหลายครั้งก่อนหน้านี้จะมีค่าข้อมูลต่ำ วิธีหนึ่งในการจัดลำดับความสำคัญการทดสอบคือการรันการทดสอบค่าข้อมูลที่สูงขึ้นก่อนการทดสอบค่าข้อมูลที่ต่ำกว่า

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

ย้อนกลับไปและฉันเห็นอีกครั้งที่นี่บางคนที่ไม่เข้าใจการทดสอบจะตอบสนองว่าการทดสอบที่ออกแบบมาเพื่อค้นหามุมกรณีเสียเวลาเมื่อเทียบกับการทดสอบการใช้งานที่สำคัญของฟังก์ชั่นหลัก พวกเขาไม่เข้าใจสองสิ่ง ครั้งแรกโดยผู้ทดสอบหาเวลาเพื่อตรวจสอบค่าขอบเขตการใช้งานที่สำคัญของฟังก์ชั่นหลักได้รับการออกกำลังกายหลายครั้งแล้ว (ใช่มีข้อยกเว้นและกลุ่มการทดสอบส่วนใหญ่จะให้ความสนใจกับข้อยกเว้นเหล่านั้นอย่างระมัดระวัง) ประการที่สองเหตุผลในการทดสอบที่มีค่ามากที่สุดคือโปรแกรมนั้นมีแนวโน้มที่จะล้มเหลวด้วยค่าที่มากที่สุด ถ้ามันไม่ได้ล้มเหลวอย่างสุดขีดคุณจะต้องลองอย่างอื่น นี่เป็นกฎที่มีประสิทธิภาพ ในทางกลับกันถ้ามันล้มเหลวด้วยค่าที่มากเกินไปผู้ทดสอบอาจหยุดและรายงานข้อผิดพลาดหรือผู้ทดสอบอาจแก้ไขปัญหาเพิ่มเติม เพื่อดูว่าโปรแกรมล้มเหลวในลักษณะเดียวกันกับค่าปกติมากกว่าหรือไม่ ใครทำการแก้ไขปัญหานั้น (ผู้ทดสอบหรือโปรแกรมเมอร์) เป็นเรื่องของวัฒนธรรมองค์กร บริษัท บางแห่งกำหนดงบประมาณเวลาของผู้ทดสอบสำหรับเรื่องนี้บางคนวางแผนงบประมาณโปรแกรมเมอร์และบางคนคาดหวังว่าโปรแกรมเมอร์จะแก้ไขข้อผิดพลาดที่มุมกรณีไม่ว่าจะเป็นแบบทั่วไปหรือไม่เพื่อให้การแก้ไขปัญหาไม่เกี่ยวข้อง ความเข้าใจผิดที่พบบ่อย - ผู้ทดสอบกำลังเสียเวลา (มากกว่าการเพิ่มประสิทธิภาพสูงสุด) โดยการทดสอบค่าสุดขีดเป็นอีกเหตุผลหนึ่งที่ "การทดสอบที่ไม่ได้ออกแบบมาเพื่อเปิดเผยข้อผิดพลาดคือการเสียเวลา" เป็นข้อความที่เหมาะสมสำหรับผู้ทดสอบ มันเป็นข้อแตกต่างจากการให้กำลังใจจากโปรแกรมเมอร์บางคนถึง (โดยผล) ไม่เคยทำการทดสอบที่อาจท้าทายโปรแกรม ข้อความนี้มีขนาดใหญ่เกินไป แต่การสนทนาทั้งหมดนั้นมีขนาดใหญ่เกินไป

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

แต่ตามกฎทั่วไปถ้าฉันสามารถระบุเพียงหนึ่งกฎเท่านั้น (เช่นการพูดกับผู้บริหารที่หัวหน้าหัวระเบิดถ้าเขาพยายามประมวลผลมากกว่าหนึ่งประโยค) มันอาจเป็นไปได้ว่าการทดสอบข้อมูลที่มีค่าต่ำมักเป็นการเสียเวลาเปล่า


4
+1 สำหรับการสละเวลาในการตอบคำถามคุณเป็นแหล่งข้อมูลที่เชื่อถือได้รวมถึงตรวจสอบการใช้คำว่า "Build Verification Tests" ซึ่งหลาย ๆ คนมองฉันด้วยความตลกในการใช้ ... ยินดีที่ได้เห็นทุกคน ความสูงของคุณใช้เวลาในการช่วยเหลือผู้คนที่นี่
Jimmy Hoffa

1
Eric G: ฉันคิดว่าถ้าคุณอ่านอีกครั้งว่าคุณจะเห็น Cem ระบุว่าในฐานะที่เป็นส่วนหนึ่งของผู้อ่านที่เข้าใจว่ามุมมองของเขาในเรื่องนั้นพัฒนาไปตามกาลเวลา หรือคุณเพียงแค่ดำเนินการและเพิกเฉยต่อความละเอียดอ่อนและคุณสมบัติเพื่อถอดความเซม (และฉันใช้ "คุณสมบัติ" ไม่ใช่ข้อมูลประจำตัวของเขา แต่เป็นข้อยกเว้น)
Jim Holmes

คำพูดของคุณทำให้ฉันนึกถึงบางสิ่งที่ฉันสังเกตเห็นเกี่ยวกับวิทยาศาสตร์: ไม่มีใครพิสูจน์ (หรือสนับสนุนความหมาย) ทฤษฎีทางวิทยาศาสตร์ด้วยการทำการทดลองเราคาดหวังว่าผลลัพธ์ที่สอดคล้องกับทฤษฎี; วิธีที่จะสนับสนุนทฤษฎีคือการใช้ความพยายามอย่างแท้จริงในการทดลองอุปกรณ์ที่จะไม่สนับสนุน แต่ก็ไม่สามารถทำได้
supercat

@supercat คุณสามารถสนับสนุนทฤษฎีด้วยการทดสอบสิ่งที่สอดคล้องกับทฤษฎีหากการทดสอบไม่ได้เกิดขึ้นกับคุณก่อนทฤษฎี (เช่นการแสดงความเร่งของวัตถุที่ตกลงมาในสุญญากาศเป็นเช่นเดียวกับที่คุณคำนวณให้เป็น บอกมากกว่าแสดงว่ามันตกลงมา) การทดสอบ Edge-case นั้นคล้ายคลึงกัน ฉันอาจคาดหวังว่าซอฟต์แวร์จะทำงานได้อย่างถูกต้องเมื่อจัดการกับค่าสุดขีด แต่ให้ความมั่นใจในคุณภาพที่จะเห็นว่าเกิดขึ้นมากกว่าทำซ้ำค่าอินพุตที่อาจเห็นในระหว่างการพัฒนาพร้อมกับมีแนวโน้มที่จะพบข้อผิดพลาด
Jon Hanna

@ จอนฮัน: คำพูดของฉันไม่ดี: ปัญหาไม่ได้คาดหวัง แต่ความพยายาม เราไม่สามารถพิสูจน์ทฤษฎีได้โดยพยายามหาแบบทดสอบที่จะผ่าน เราต้องใช้ความพยายามอย่างแท้จริงเพื่อค้นหาการทดสอบที่จะล้มเหลวหากไม่ถูกต้อง
supercat

11

แนวคิดนี้เป็นไปตาม Kaner "เนื่องจากคุณจะหมดเวลาก่อนที่จะหมดกรณีทดสอบคุณจำเป็นต้องใช้เวลาที่มีอยู่อย่างมีประสิทธิภาพที่สุดเท่าที่จะทำได้"

แนวคิดที่อยู่เบื้องหลังคำพูดที่คุณถามเกี่ยวกับการนำเสนอและอธิบายอย่างละเอียดในบทความซอฟต์แวร์คอมพิวเตอร์ทดสอบโดยCem Kaner , Jack Falk, Hung Quoc Nguyen ในบท "วัตถุประสงค์และข้อ จำกัด ของการทดสอบ":

ดังนั้นทำไมต้องทดสอบ

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

วัตถุประสงค์ของการทดสอบโปรแกรมคือการค้นหาปัญหาในนั้น

การค้นหาปัญหาเป็นหัวใจของงานของคุณ คุณควรต้องการค้นหามากที่สุด ปัญหาที่ร้ายแรงมากขึ้นจะดีกว่า

เนื่องจากคุณจะหมดเวลาก่อนที่จะหมดกรณีทดสอบจึงจำเป็นที่จะต้องใช้เวลาที่มีอยู่ให้มีประสิทธิภาพที่สุดเท่าที่จะทำได้ บทที่ 7,8,12 และ 13 พิจารณาลำดับความสำคัญโดยละเอียด หลักการชี้นำสามารถทำได้ง่ายๆ:


การทดสอบที่เปิดเผยปัญหาคือความสำเร็จ การทดสอบที่ไม่เปิดเผยปัญหาเป็นเรื่องเสียเวลา


พิจารณาการเปรียบเทียบต่อไปนี้จาก Myers (1979) สมมติว่ามีบางอย่างผิดปกติกับคุณ คุณไปหาหมอ เขาควรจะทำการทดสอบค้นหาสิ่งที่ผิดและแนะนำการดำเนินการแก้ไข เขารันการทดสอบหลังการทดสอบหลังการทดสอบ ในตอนท้ายของทุกสิ่งเขาไม่สามารถพบสิ่งผิดปกติ เขาเป็นผู้ทดสอบที่ยอดเยี่ยมหรือเป็นนักวินิจฉัยที่ไร้ความสามารถหรือไม่? หากคุณป่วยจริงๆเขาไร้ความสามารถและการทดสอบที่มีค่าใช้จ่ายทั้งหมดนั้นเป็นการเสียเวลาเงินและความพยายาม ในซอฟต์แวร์คุณเป็นผู้วินิจฉัย โปรแกรมเป็นผู้ป่วยที่ป่วย (แน่นอน) ...


คุณเห็นว่าประเด็นข้างต้นคือคุณควรจัดลำดับความสำคัญการทดสอบของคุณอย่างชาญฉลาด การทดสอบคาดว่าจะใช้เวลาจำกัดและไม่สามารถทดสอบทุกอย่างในเวลาที่กำหนด

ลองนึกภาพว่าคุณใช้เวลาหนึ่งวัน (สัปดาห์เดือน) ในการทำการทดสอบไม่พบข้อบกพร่องและปล่อยให้ข้อบกพร่องบางอย่างผ่านไปเพราะคุณไม่มีเวลาทำการทดสอบที่จะเปิดเผย หากสิ่งนี้เกิดขึ้นคุณไม่สามารถพูดได้ว่า "ไม่ใช่ความผิดของฉันเพราะฉันกำลังยุ่งกับการทดสอบอื่น ๆ " เพื่อพิสูจน์ความผิดพลาดนี้ - ถ้าคุณพูดเช่นนั้นคุณจะยังคงต้องรับผิดชอบ

คุณเสียเวลากับการทดสอบที่ไม่เปิดเผยข้อบกพร่องและด้วยเหตุนี้คุณจึงพลาดการทดสอบที่จะพบข้อบกพร่อง

(ในกรณีที่คุณสงสัยคิดถึงชอบดังกล่าวข้างต้นโดยทั่วไปมักจะหลีกเลี่ยงไม่ได้ไม่ว่าคุณจะลองและมีมีวิธีที่จะจัดการกับสิ่งเหล่านี้ แต่ที่จะมีมากขึ้นหัวข้อสำหรับคำถามที่แยกต่างหาก ... และอาจจะเป็นแบบที่ดีกว่าสำหรับ SQA SE.)


12
คำตอบนี้แสดงถึงตำแหน่งของเขาอย่างถูกต้อง แต่มันก็คุ้มค่าที่จะชี้ให้เห็นว่าผู้คนจำนวนมากคิดว่าตำแหน่งของเขาผิด ด้วยตัวเลือกระหว่างการทดสอบที่แสดงให้เห็นถึงฟังก์ชั่นที่สำคัญที่สุดในแอปทำงานอย่างถูกต้อง (การทดสอบการยอมรับถ้าคุณจะ) และการทดสอบที่พบข้อผิดพลาดเล็กน้อย (การจัดตำแหน่งโดยหนึ่งพิกเซล) ในมุมที่ไม่ค่อยได้ใช้ รู้ว่าฉันจะเลือกอะไรในเวลา จำกัด และสำหรับการเปรียบเทียบของแพทย์: ถ้าฉันจะไปตรวจสอบแทนที่จะตอบสนองต่ออาการการยืนยันว่าหัวใจเป็นสิ่งที่ดีปอดเป็นสิ่งที่ดีและอื่น ๆ เป็นผลลัพธ์ที่ดี ดังนั้นที่นั่น
Kate Gregory

@KateGregory ฉันเห็นด้วยฉันคิดเหมือนกัน ฉันพบความคิดเห็นของเขาอย่างไม่ถูกต้องเราทดสอบเพื่อรวบรวมข้อมูลเป็นส่วนใหญ่ ..
John V

2
@KateGregory เห็นด้วย - ฉันไม่คิดว่ามันถูกต้องที่จะติดฉลากการทดสอบที่ผ่านมาว่าเป็นของเสียทั้งหมด แม้ว่าฉันคิดว่าจุดหนึ่งที่เขาทำนั้นไม่มีเวลา : หากบั๊กหลุดจากการทดสอบการปล่อย QA จะต้องมีอะไรมากกว่า"โอ้ แต่เรากำลังยุ่งอยู่กับการทดสอบอื่น ๆ "เพื่อปกปิดหลัง ฉันเคยผ่านสิ่งนี้มาเป็นผู้ทดสอบตัวเองในอดีตและดูสิ่งนี้ในตอนนี้ว่าฉันเป็นนักพัฒนาและฉันไม่คิดว่ามันจะหายไปไหน
gnat

4

ฉันไม่รู้นาย Caner แต่เป็น IMHO

การทดสอบที่ไม่อาจหาข้อผิดพลาด

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

สถานการณ์ดังกล่าวสามารถเกิดขึ้นได้เช่นถ้าคุณเพิ่งผ่านรายการแบบสุ่ม - ฉันอาจพูดได้ว่า "งี่เง่า" (ยกโทษให้ฉันคำนั้น) - เลือกกรณีทดสอบที่โปรแกรมของคุณโดยไม่คิดว่าพวกเขาจะตรวจสอบกรณีขอบใหม่ คลาสของข้อมูลอินพุตของคุณหรือหากพวกเขาเพิ่มการครอบคลุมโค้ดที่เกี่ยวข้องกับการทดสอบที่เขียนขึ้นแล้ว


-1

ในความคิดของฉันอ้างถึงนี้หมายถึงการทดสอบทั่วไปหรือไม่แข็งแรงเกินไป

หากคุณทำการทดสอบสำหรับฟังก์ชั่นที่ตรวจสอบความถูกต้องของอีเมลและในการทดสอบที่คุณให้เฉพาะอีเมลที่ถูกต้องการทดสอบนั้นไม่มีประโยชน์อย่างสมบูรณ์ คุณจะต้องทดสอบฟังก์ชั่นนี้สำหรับสตริง "ใด ๆ " posible, อีเมลที่ไม่ถูกต้อง, อีเมลยาวเกินไป, อักขระ unicode (áêñç .... )

หากคุณโค้ดการทดสอบที่ตรวจสอบว่า name@dom.com ส่งคืนค่าจริงและ name @ com ส่งคืนค่าเท็จการทดสอบนั้นไม่เหมือนกับการทดสอบเลย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.