qc เป็นเครื่องมือทดสอบที่ช่วยให้คุณเขียนคุณสมบัติที่คุณคาดว่าจะถือความจริงและให้คอมพิวเตอร์สร้างกรณีทดสอบการสุ่มตรวจสอบว่าคุณสมบัติเหล่านี้จริงถือ & nbsp;. ยกตัวอย่างเช่นถ้าคุณได้เขียนบีบอัดและขยายฟังก์ชั่นสำหรับ โปรแกรมบีบอัดข้อมูลบางส่วนของสถานที่ที่เห็นได้ชัดในการทดสอบคือการบีบอัดและคลายสตริงให้กลับสายเดิม นี่คือวิธีที่คุณสามารถแสดงความเห็นว่า:
นำเข้า UnitTest
นำเข้า qc
ชั้น TestCompression (unittest.TestCase):
& nbsp; @ qc.property
& nbsp; def test_compress_decompress (ตัวเอง):
& nbsp; "" ". ทดสอบที่บีบอัดและผลตอบแทนที่ข้อมูลเดิม" ""
& nbsp; ข้อมูล = qc.str () # สตริงโดยพลการ ค่าจะถูกสุ่ม
& nbsp; self.assertEqual (ข้อมูลขยาย (บีบอัดข้อมูล ()) repr (ข้อมูล))
นั่นคือการทดสอบสามัญกับงูหลามตัวในกรอบ UnitTest (ซึ่งเป็นเหตุผลที่มีสำเร็จรูปมาก) อีกวิธีหนึ่งที่คุณสามารถทำสิ่งเดียวที่แน่นอนกับกรอบการทดสอบที่แตกต่างกันเช่น verbose น้อยที่สุดจมูกก็ดีมาก @ มัณฑนา qc.property ทำงานฟังก์ชั่นการตกแต่งหลายครั้งและแต่ละครั้งค่าที่ส่งกลับโดยฟังก์ชั่นเช่น qc.string () มีความแตกต่างกัน ในคำอื่น ๆ QuickCheck เข้ากันได้กับสวยมากทุกกรอบการทดสอบหน่วยออกมี; มันไม่ได้เรียกร้องโดยเฉพาะอย่างยิ่ง
ฟังก์ชั่นเช่น qc.str () qc.int () และอื่น ๆ สร้างค่าโดยพลการของบางประเภท ในตัวอย่างข้างต้นเราจะเข้าไปยุ่งเกี่ยวกับทรัพย์สินที่ถือเป็นจริงสำหรับสตริงทั้งหมด เมื่อคุณเรียกใช้การทดสอบ QuickCheck จะสร้างสตริงแบบสุ่มสำหรับการทดสอบ
คุณจะสังเกตเห็นว่าผมบอกว่า "สุ่ม" ไม่ "สุ่ม" นี่คือความตั้งใจ การกระจายตัวของค่าจะเอ็นดูที่จะรวมค่าที่น่าสนใจเช่นสตริงที่ว่างเปล่าหรือสตริงที่มีตัวอักษร NUL กลางหรือสตริงที่มีข้อความภาษาอังกฤษ โดยทั่วไป QuickCheck พยายามที่จะให้มีการผสมผสานที่ดีของค่าหากินที่ฉลาดและมีแบบแผน นี้เป็นหลักสิ่งที่คุณจะทำอย่างไรถ้าคุณมีการเขียนอย่างละเอียดจริงๆกรณีทดสอบด้วยมือยกเว้นว่าคุณไม่ได้ที่จะทำมัน ในทางปฏิบัติคอมพิวเตอร์มีอคติน้อยเกี่ยวกับสิ่งที่ถือว่าเป็นข้อมูลที่มีเหตุผลดังนั้นจึงมักจะพบข้อบกพร่องที่จะไม่ได้เกิดขึ้นกับคุณในการเขียนกรณีทดสอบ มันไม่ได้รู้วิธีที่จะหลีกเลี่ยงข้อบกพร่องจิตใต้สำนึก
คุณไม่ได้ จำกัด อยู่ที่ฟังก์ชั่นมูลค่าโดยพลการในตัว คุณสามารถใช้พวกเขาเป็นอาคารที่จะสร้างบล็อกของคุณเอง ตัวอย่างเช่น:
ระดับพอยต์ (วัตถุ):
& nbsp; def __init __ (ตัวเอง, x, y):
& nbsp; self.x, self.y = ลอย (x), ลอย (Y)
จุด def ():
& nbsp; "" "รับจุดโดยพล." ""
& nbsp; x = qc.int (-20, 20)
& nbsp; y = qc.int (-34, 50)
& nbsp; กลับจุด (x, y)
จากนั้นคุณสามารถใช้เพื่อสร้างค่าจุดโดยพลการในคุณสมบัติ นี่คือการทดสอบจมูกสไตล์:
@ qc.property
def test_triangle_inequality ():
& nbsp; PT จุด = ()
& nbsp; ยืนยัน ABS (pt.x) + เอบีเอส (pt.y)> = Math.sqrt (pt.x ** 2 + pt.y ** 2) (pt.x, pt.y)
เมื่อคุณเรียกใช้นี้สิ่งมหัศจรรย์ที่เกิดขึ้น: QuickCheck จะพยายามที่จะสร้างค่าหากินทั้ง x และตัวแปรในชั้นเรียนและจุดร่วมกันเพื่อให้คุณจะเห็นจุดเช่น (0, 0), (1, 1) ( 0, 1) (385,904, 0) เช่นเดียวกับคนที่สุ่มเช่น (584, -35809648) ในคำอื่น ๆ มากกว่าแค่การวาดภาพ x และค่านิยมและจากกระแสของตัวเลขสุ่มที่มีค่าหากินบางอย่างในนั้น, QuickCheck จริงจะพยายามที่จะสร้างการรวมหากินของ x และ y พิกัด
ฟังก์ชั่นสำหรับการรับข้อมูลโดยพล
- int (ต่ำสูง) ให้ ints ระหว่างตัวเลือกขอบเขตต่ำและสูง
- ยาว (ต่ำสูง) ให้ปรารถนาระหว่างตัวเลือกขอบเขตต่ำและสูง
- ลอย (ต่ำสูง) ให้ลอยระหว่างตัวเลือกขอบเขตต่ำและสูง ไม่มีอนันต์หรือค่าน่าน
& nbsp; Str (ความยาว = None, maxlen = ไม่มี) ให้สตริงของแบบ str การเข้ารหัสเป็น UTF-8 ถ้าความยาวจะได้รับสายจะเป็นตรงที่ยาว หาก maxlen จะได้รับความยาวสตริงจะเป็นตัวละครที่ maxlen มากที่สุด
- Unicode (ความยาว = ไม่มี maxlen = ไม่มี) ให้สตริง Unicode, ประเภท Unicode ถ้าความยาวจะได้รับสายจะเป็นตรงที่ยาว หาก maxlen จะได้รับความยาวสตริงจะเป็นตัวละครที่ maxlen มากที่สุด
- ชื่อ () ให้ชื่อใน Unicode ช่วงนี้จากธรรมดาเช่น "จอห์นสมิ ธ " เพื่อที่แปลกใหม่ - ชื่อที่มีช่องว่างที่ไม่ทำลายหรือที่อยู่อีเมลหรืออักขระ Unicode นอกพื้นฐานเครื่องบินพูดได้หลายภาษา นี่คือถ้ามีอะไรที่ผิดปกติน้อยกว่าชื่อที่คุณจะเห็นในชุดใหญ่เพียงพอของข้อมูลทางอินเทอร์เน็ต
- nameUtf8 () เป็นชื่อเดียวกับชื่อ () เข้ารหัส ('utf8').
- fromList (รายการ) กลับรายการที่สุ่มจากรายชื่อ นี้จะเป็นประโยชน์ส่วนใหญ่สำหรับการสร้างฟังก์ชั่นเครื่องกำเนิดไฟฟ้าข้อมูลโดยพลการของคุณเอง
- randstr (ความยาว = ไม่มี maxlen = sys.maxint) ให้สตริงของไบต์สุ่ม ถ้าความยาวจะได้รับสายจะเป็นตรงที่ยาว หาก maxlen จะได้รับความยาวสตริงจะเป็นที่มากที่สุด maxlen ไบต์
สายการผลิตโดย Str และ Unicode จะสุ่ม แต่ความพยายามบางอย่างได้รับการใส่ลงไปทำให้พวกเขาพอผิดปกติที่จะเผยให้เห็นข้อบกพร่องในจำนวนมากทั้งจากการประมวลผลโค้ดสตริง รายชื่อจะขึ้นอยู่อย่างอิสระในความทรงจำที่น่ากลัวของการได้เห็นความผิดพลาดของการประมวลผลโค้ดชื่อกับข้อมูลจริงของโลกมากกว่าและเหนือและมากกว่าอีกครั้งมันก็กลายเป็นที่เคยชัดเจนมากขึ้นว่าโลกเป็นคนบ้าและเราจะถึงวาระอย่างแท้จริง (ความรู้สึกนี้ผ่านไปเมื่อคุณได้รับความคุ้มครองการทดสอบเพียงพอและสิ่งที่ในที่สุดก็หยุด crashing. มีความหวัง!)
ชื่อและข้อมูลเช่นสตริงใน qc.arbitrary อาจจะเป็นที่น่าสนใจเป็นแหล่งที่มาของข้อมูลกรณีทดสอบ deteministic เพิ่มเติม รู้สึกอิสระที่จะขอยืมใด ๆ ของมัน internals มีเวทมนตร์ แต่ของชิ้นส่วนภายในที่มีมนต์ขลังที่คนที่น่าสนใจมากที่สุดคือใน qc.arbitrary และ qc
ต้องการ .
- หลาม
ความคิดเห็นที่ไม่พบ