ฉันกำลังดีบั๊กด้วยจุดพักและฉันตระหนักถึงการเรียกร้องยืนยันหรือไม่ ฉันคิดว่ามันเป็นเพียงสำหรับการทดสอบหน่วย มันทำอะไรได้มากกว่าเบรกพอยต์? เนื่องจากฉันสามารถเบรกพอยต์ทำไมฉันจึงควรใช้ Assert
ฉันกำลังดีบั๊กด้วยจุดพักและฉันตระหนักถึงการเรียกร้องยืนยันหรือไม่ ฉันคิดว่ามันเป็นเพียงสำหรับการทดสอบหน่วย มันทำอะไรได้มากกว่าเบรกพอยต์? เนื่องจากฉันสามารถเบรกพอยต์ทำไมฉันจึงควรใช้ Assert
คำตอบ:
ในการรวบรวมดีบักให้Assert
ใช้เงื่อนไขบูลีนเป็นพารามิเตอร์และแสดงไดอะล็อกข้อผิดพลาดหากเงื่อนไขเป็นเท็จ โปรแกรมดำเนินการโดยไม่หยุดชะงักหากเงื่อนไขเป็นจริง
หากคุณคอมไพล์ใน Release ทุกรายการDebug.Assert
จะถูกปล่อยออกโดยอัตโนมัติ
Debug.Assert
ในโหมดการเปิดตัว?
8 การป้องกันการเขียนโปรแกรม
8.2 การยืนยัน
การยืนยันเป็นรหัสที่ใช้ในระหว่างการพัฒนาซึ่งโดยปกติจะเป็นรูทีนหรือมาโครที่อนุญาตให้โปรแกรมตรวจสอบตัวเองขณะที่มันทำงาน เมื่อการยืนยันเป็นจริงนั่นหมายความว่าทุกอย่างทำงานตามที่คาดไว้ เมื่อเป็นเท็จนั่นหมายความว่าตรวจพบข้อผิดพลาดที่ไม่คาดคิดในรหัส ตัวอย่างเช่นหากระบบสันนิษฐานว่าไฟล์ข้อมูลลูกค้าจะไม่มีระเบียนมากกว่า 50,000 รายการโปรแกรมอาจมีการยืนยันว่าจำนวนระเบียนน้อยกว่าหรือเท่ากับ 50,000 ตราบใดที่จำนวนของระเบียนน้อยกว่าหรือเท่ากับ 50,000 การยืนยันจะเงียบ หากพบมากกว่า 50,000 เร็กคอร์ดมันจะดัง "ยืนยัน" ว่ามีข้อผิดพลาดในโปรแกรม
การยืนยันเป็นประโยชน์อย่างยิ่งในโปรแกรมขนาดใหญ่ซับซ้อนและในโปรแกรมที่มีความน่าเชื่อถือสูง พวกเขาทำให้โปรแกรมเมอร์สามารถกำจัดข้อสันนิษฐานของอินเตอร์เฟสที่ไม่ตรงกันอย่างรวดเร็วยิ่งขึ้นข้อผิดพลาดที่คืบคลานเข้ามาเมื่อมีการแก้ไขโค้ดและอื่น ๆ
การยืนยันมักจะใช้เวลาสองข้อโต้แย้ง: นิพจน์บูลีนที่อธิบายถึงข้อสมมติที่ควรจะเป็นจริงและข้อความที่จะแสดงถ้ามันไม่ได้
( ... )
โดยปกติคุณไม่ต้องการให้ผู้ใช้เห็นข้อความยืนยันในรหัสการผลิต การยืนยันเป็นหลักเพื่อใช้ในระหว่างการพัฒนาและการบำรุงรักษา โดยทั่วไปการยืนยันจะถูกรวบรวมเป็นรหัสในเวลาการพัฒนาและรวบรวมจากรหัสสำหรับการผลิต ในระหว่างการพัฒนาการยืนยันจะล้างออกสมมติฐานที่ขัดแย้งเงื่อนไขที่ไม่คาดคิดค่าที่ไม่ถูกต้องถูกส่งไปยังงานประจำและอื่น ๆ ในระหว่างการผลิตพวกเขาจะรวบรวมจากรหัสเพื่อให้ยืนยันไม่ลดประสิทธิภาพของระบบ
คุณควรใช้มันหลายครั้งเมื่อคุณไม่ต้องการที่จะเบรกพอยต์ทุก ๆ บรรทัดของโค้ดเพื่อตรวจสอบตัวแปร แต่คุณต้องการได้รับผลตอบรับบางอย่างถ้ามีสถานการณ์บางอย่างเกิดขึ้นตัวอย่างเช่น
Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
System.Diagnostics
Assert ยังเปิดโอกาสให้คุณหัวเราะเยาะทักษะการออกแบบ UI ของ Microsoft อีกครั้ง ฉันหมายถึง: กล่องโต้ตอบที่มีสามปุ่มยกเลิก, ลองใหม่, ไม่ต้องสนใจและคำอธิบายวิธีตีความในแถบหัวเรื่อง!
Assert ช่วยให้คุณสามารถยืนยันเงื่อนไข (โพสต์หรือ pre) ในรหัสของคุณ เป็นวิธีการบันทึกความตั้งใจของคุณและให้ดีบักเกอร์แจ้งให้คุณทราบพร้อมกล่องโต้ตอบหากไม่ได้ตั้งใจ
Assert จะไปพร้อมกับรหัสของคุณและสามารถใช้เพื่อเพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับความตั้งใจของคุณ
Assert สามารถช่วยคุณกำหนดพฤติกรรมการส่งข้อความแยกต่างหากระหว่างการทดสอบและการเปิดตัว ตัวอย่างเช่น,
Debug.Assert(x > 2)
จะทำให้เกิดการหยุดพักหากคุณใช้งานบิลด์ "debug" ไม่ใช่บิลด์ออก มีตัวอย่างเต็มของพฤติกรรมนี้ที่นี่
วิธีแรกของทั้งหมดAssert()
พร้อมใช้งานสำหรับTrace
และDebug
คลาส
Debug.Assert()
กำลังดำเนินการในโหมดดีบักเท่านั้น
Trace.Assert()
กำลังดำเนินการในโหมดดีบั๊กและรีลีส
นี่คือตัวอย่าง:
int i = 1 + 3;
// Debug.Assert method in Debug mode fails, since i == 4
Debug.Assert(i == 3);
Debug.WriteLine(i == 3, "i is equal to 3");
// Trace.Assert method in Release mode is not failing.
Trace.Assert(i == 4);
Trace.WriteLine(i == 4, "i is equla to 4");
Console.WriteLine("Press a key to continue...");
Console.ReadLine();
เรียกใช้รหัสนี้ในโหมด Debug และจากนั้นในโหมด Release
คุณจะสังเกตเห็นว่าในระหว่างโหมดดีบั๊กDebug.Assert
คำสั่งรหัสของคุณล้มเหลวคุณจะได้รับกล่องข้อความแสดงการติดตามสแต็กปัจจุบันของแอปพลิเคชัน นี้ไม่ได้เกิดขึ้นในโหมดที่วางจำหน่ายตั้งแต่สภาพที่เป็นจริงTrace.Assert()
(i == 4)
WriteLine()
วิธีการเพียงให้ตัวเลือกในการบันทึกข้อมูลไปยังเอาต์พุต Visual Studio
คุณสมบัติการยืนยันอย่างมากใน Design by Contract (DbC) ซึ่งฉันเข้าใจว่าถูกนำเสนอ / รับรองโดย Meyer, Bertand 1997. การสร้างซอฟต์แวร์เชิงวัตถุ
คุณลักษณะที่สำคัญคือพวกเขาจะต้องไม่สร้างผลข้างเคียงตัวอย่างเช่นคุณสามารถจัดการกับข้อยกเว้นหรือใช้แนวทางปฏิบัติที่แตกต่างกันโดยใช้คำสั่ง if (การตั้งโปรแกรมป้องกัน)
การยืนยันใช้เพื่อตรวจสอบเงื่อนไขก่อน / หลังของสัญญาความสัมพันธ์กับลูกค้า / ผู้จัดหา - ลูกค้าจะต้องตรวจสอบให้แน่ใจว่ามีการปฏิบัติตามเงื่อนไขล่วงหน้าของผู้จัดหาเช่น ส่ง£ 5 และซัพพลายเออร์จะต้องตรวจสอบให้แน่ใจว่าโพสต์เงื่อนไขตรงเช่น ส่งดอกกุหลาบ 12 ดอก (คำอธิบายง่ายๆของลูกค้า / ผู้จำหน่าย - สามารถยอมรับได้น้อยลงและให้มากขึ้น แต่เกี่ยวกับการยืนยัน) C # ยังแนะนำ Trace.Assert () ซึ่งสามารถใช้สำหรับรหัสการเปิดตัว
เพื่อตอบคำถามว่าใช่พวกเขายังมีประโยชน์ แต่สามารถเพิ่มความซับซ้อน + อ่านรหัสและเวลา + ยากที่จะรักษา เราควรจะใช้มันยังไง? ใช่เราทุกคนจะใช้พวกเขา? อาจไม่หรือไม่เท่าที่ Meyer อธิบาย
(แม้แต่หลักสูตร OU Java ที่ฉันได้เรียนรู้เทคนิคนี้เพียงแสดงตัวอย่างง่ายๆและส่วนที่เหลือของรหัสไม่ได้บังคับใช้กฎการยืนยัน DbC ในรหัสส่วนใหญ่ แต่ถูกสันนิษฐานว่าใช้เพื่อรับรองความถูกต้องของโปรแกรม!)
วิธีที่ฉันคิดว่ามันคือ Debug.Assert คือวิธีสร้างสัญญาเกี่ยวกับวิธีเรียกใช้วิธีการโดยมุ่งเน้นไปที่ข้อมูลเฉพาะเกี่ยวกับค่าของพารามิเตอร์ (แทนที่จะเป็นแค่ประเภท) ตัวอย่างเช่นถ้าคุณไม่ควรส่งค่า null ในพารามิเตอร์ตัวที่สองคุณเพิ่ม Assert รอบพารามิเตอร์นั้นเพื่อบอกให้ผู้บริโภคไม่ทำเช่นนั้น
มันป้องกันไม่ให้ใครบางคนใช้รหัสของคุณในทางที่น่ากลัว แต่มันยังช่วยให้วิธีการที่จะนำไปสู่การผลิตและไม่ให้ข้อความที่น่ารังเกียจแก่ลูกค้า (สมมติว่าคุณสร้าง Build build)