แนวปฏิบัติที่ดีที่สุดสำหรับโปรแกรมทดสอบที่มีพฤติกรรมสุ่มคืออะไร


14

เมื่อทำงานวิจัยและพัฒนาฉันมักพบว่าตัวเองกำลังเขียนโปรแกรมที่มีการสุ่มในระดับสูงในพฤติกรรมของพวกเขา ตัวอย่างเช่นเมื่อฉันทำงานในการเขียนโปรแกรมทางพันธุกรรมฉันมักจะเขียนโปรแกรมที่สร้างและรันซอร์สโค้ดแบบสุ่มโดยพลการ

ปัญหาเกี่ยวกับการทดสอบรหัสดังกล่าวคือข้อผิดพลาดมักจะเป็นระยะ ๆ และอาจเป็นเรื่องยากที่จะทำซ้ำ สิ่งนี้นอกเหนือไปจากการตั้งค่าเมล็ดพันธุ์แบบสุ่มเป็นค่าเดียวกันและเริ่มต้นการดำเนินการ

ตัวอย่างเช่นโค้ดอาจอ่านข้อความจาก kernal ring buffer จากนั้นทำการข้ามแบบมีเงื่อนไขกับเนื้อหาข้อความ ตามปกติสถานะของบัฟเฟอร์บัฟเฟอร์จะเปลี่ยนไปเมื่อพยายามทำซ้ำอีกครั้งในภายหลัง

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

มีการกำหนดแนวปฏิบัติที่ดีที่สุดสำหรับระบบทดสอบประเภทนี้หรือไม่? ถ้าเป็นเช่นนั้นการอ้างอิงบางอย่างจะมีประโยชน์มาก ถ้าไม่คำแนะนำอื่น ๆ ยินดีต้อนรับ!


5
คุณไม่สามารถจำลองบัฟเฟอร์วงแหวนเคอร์เนลด้วยหรือไม่ และด้านสุ่มของรหัสของคุณ?
Jonathan Merlet

1
@JonathanMerlet อาจเกิดขึ้น แต่ปัญหาคือเมื่อปรับใช้รหัสจะมีการเข้าถึงบัฟเฟอร์แหวนจริง (แน่นอนกับระบบปฏิบัติการจริง) ดังนั้นหากฉันทดสอบเฉพาะรุ่นที่เยาะเย้ยเท่านั้นฉันก็จะเลื่อนการค้นพบข้อบกพร่องเหล่านี้ไปจนกระทั่งภายหลัง
John Doucette

ฉันดูเหมือนว่าปัญหาไม่เกี่ยวข้องกับพฤติกรรมแบบสุ่มของโปรแกรม(เนื่องจากสามารถควบคุมได้โดยการสุ่มเมล็ด) แต่ไปยังสถานะเฉพาะของ 'kernel ring buffer' ดังนั้นคำถามของคุณคือ 'ฉันจะทดสอบโปรแกรมที่ขึ้นอยู่กับสถานะภายนอก' ได้อย่างไร?
AakashM

@AakashM ใช่นั่นเป็นวิธีที่ดีกว่าในการใช้วลี หากต้องการเจาะจงมากขึ้นโปรแกรมที่มีสถานะภายนอกซึ่งเข้าถึงหรือเปลี่ยนแปลงสถานะภายนอกอย่างต่อเนื่อง
John Doucette

คำตอบ:


7

มันมีประโยชน์ในการเพิ่ม hooks ตามที่แนะนำเพื่อสร้างสถานะที่แน่นอน ติดตั้งระบบเพื่อให้สามารถทิ้ง "เมล็ด" ของมัน (ในกรณีของคุณรวมถึงเมล็ดพันธุ์ PRNG รวมถึงบัฟเฟอร์วงแหวนเคอร์เนลและแหล่งข้อมูลอื่น ๆ ของอินพุต nondeterministic)

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

ในกรณีเฉพาะของการเข้าถึงเคอร์เนลฉันขอแนะนำให้ทำการจำลองในกรณีใด ๆ ใช้การเยาะเย้ยเพื่อบังคับให้คลาสเทียบเท่าที่มีโอกาสน้อยที่จะปรากฏขึ้นในทางปฏิบัติในจิตวิญญาณของ "ว่างเปล่า" และ "เต็ม" สำหรับภาชนะบรรจุหรือ "0, 1, 2 ^ n, 2 ^ n + 1, หลาย" สำหรับ สิ่งที่นับได้ จากนั้นคุณสามารถทดสอบกับจำลองและของจริงโดยรู้ว่าคุณได้จัดการและทดสอบเคสที่คุณเคยคิดมาแล้ว

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


6

สิ่งหนึ่งที่สมเหตุสมผลที่ต้องทำคือการหว่านตัวสร้างตัวเลขสุ่มด้วยค่าคงที่สำหรับการทดสอบเพื่อให้คุณได้รับพฤติกรรมที่กำหนดไว้


1
นี้; หรือเยาะเย้ย prng ทั้งหมด
jk

1
ขอบคุณสำหรับคำแนะนำ! ฉันทำสิ่งนี้เพื่อทดสอบหน่วยแล้ว แต่ฉันไม่สามารถทดสอบโปรแกรมที่เป็นไปได้ทั้งหมดด้วยมือ
John Doucette

2
แต่ที่นี้หมายถึงว่าคุณไม่สามารถทดสอบว่าสุ่มทำงานอย่างถูกต้อง ..
หลุยส์ริส

2

ฉันคิดว่าการทดสอบทางสถิติเป็นวิธีเดียว เช่นเดียวกับการสุ่มตัวเลข "ทดสอบ" สำหรับการสุ่มโดยการทดสอบทางสถิติดังนั้นจำเป็นต้องมีอัลกอริทึมที่ใช้พฤติกรรมแบบสุ่ม

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


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

2

ฉันไม่ใช่ผู้เชี่ยวชาญในโดเมนนี้ แต่มีครอกวิทยาศาสตร์ที่เกี่ยวข้องกับการทดสอบโปรแกรมสุ่ม

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


ขอบคุณ! ดูมีประโยชน์มาก สำหรับผู้ที่อยู่นอกสถาบันการศึกษาสามารถดึงกระดาษรุ่นก่อนพิมพ์จากที่เก็บรหัส google ของผู้เขียนได้ที่นี่: team4model.googlecode.com/svn/trunk/resources/paper/…
John Doucette
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.