การทดสอบหน่วย Guava สร้างขึ้นโดยอัตโนมัติอย่างไร


31

Guava มีกรณีทดสอบหน่วยสร้างขึ้นโดยอัตโนมัติ :

Guava มีจำนวนยูนิตทดสอบที่มาก: ณ เดือนกรกฎาคม 2012 แพ็คเกจทดสอบ Guava มีมากกว่า 286,000 กรณีทดสอบรายบุคคล สิ่งเหล่านี้ส่วนใหญ่สร้างขึ้นโดยอัตโนมัติไม่ใช่เขียนด้วยมือ แต่ความครอบคลุมในการทดสอบของ Guava นั้นละเอียดมากโดยเฉพาะ com.google.common.collect

มันถูกสร้างขึ้นมาได้อย่างไร? มีการใช้เทคนิคและเทคโนโลยีใดในการออกแบบและสร้างสิ่งเหล่านั้น


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

3
package com.google.common.collect.testingมีคลาสจำนวนมากที่มี "ตัวสร้าง" ในชื่อของพวกเขาทำให้ดูเหมือนเป็นกรอบสำหรับการสร้างการทดสอบ นอกจากนี้ยังมีแพ็คเกจย่อยที่มีคลาสที่มีเอกสารว่า "โครงกระดูก" หรือ "คลาสพื้นฐาน" สำหรับการทดสอบ ...
gnat

1
@gnat ใช่ฉันแน่ใจว่าฉันเห็นมันที่ไหนซักแห่ง com.google.common.collect.testing.featuresเช่นแสดง tfeatures / constrains คลาสคอลเลกชันที่ควรพึงพอใจและกรณีทดสอบคือการรวมกันของพวกเขา วิธีนี้พวกเขาสามารถparametrizeทดสอบ
dzieciou


คำถามที่ได้รับความสนใจมากจากชุมชน แต่ไม่มีคำตอบที่เหมาะสมเพื่อให้ห่างไกลดังนั้นฉันได้ทำตามข้อเสนอแนะของมาร์ตินและวางไว้ที่นี่: sqa.stackexchange.com/questions/5214/...
dzieciou

คำตอบ:


8

ส่วนใหญ่ของการทดสอบนี้มีไว้สำหรับการนำไปใช้ในการรวบรวม Guava พวกเขาเขียนการทดสอบทั่วไปที่ทดสอบอินเทอร์เฟซการรวบรวมอย่างละเอียดและจะสร้างชุดต่อการใช้งาน ดูตัวอย่างเช่นชั้นเรียนที่เรียกว่า,CollectionAddAllTesterListIndexOfTester

ทั้งหมดนี้ได้รับการสนับสนุนโดยห้องสมุดที่เรียกว่า testlib ซึ่งจัดส่งเป็นส่วนหนึ่งของ Guava นี่เป็นเรื่องทั่วไป สนับสนุนการเขียนการทดสอบทั่วไปสำหรับอินเทอร์เฟซใด ๆ (ไม่ใช่แค่คอลเล็กชัน) คุณสามารถระบุFeatureการใช้งานที่เป็นไปได้และทดสอบสิ่งเหล่านั้น (เช่นถ้าชุดของคุณไม่สามารถแก้ไขได้คุณคาดหวังผลลัพธ์ที่แตกต่างจากset.add()) และเมื่อคุณรันการทดสอบคุณจะระบุว่าคุณลักษณะใดที่การสนับสนุนของคุณใช้

มันขึ้นอยู่กับ JUnit 3 ไม่ใช่ 4 โดยปกติคุณจะมีคลาสที่ขยายTestCaseเต็มไปด้วยเมธอดที่มีชื่อtestSomething()และ JUnit เรียกใช้พวกเขาอย่างไตร่ตรอง ไลบรารี testlib เชื่อมโยงกับการดำเนินการทดสอบเหล่านี้เพื่อให้วงจรชีวิตมีลักษณะดังนี้:

  • สำหรับการติดตั้งแต่ละครั้งคุณต้องการทดสอบ
  • สำหรับแต่ละวิธีการทดสอบ
  • สร้างTestCaseอินสแตนซ์
  • เริ่มต้นTestSubjectGenerator- นี่คืออินเทอร์เฟซ testlib ที่คุณขยายที่คุณสร้างเรื่องการทดสอบจริง
  • เรียกใช้วิธีการทดสอบอย่างไตร่ตรอง ในระหว่างวิธีการนี้getSubjectGenerator()ให้การเข้าถึงเรื่องการทดสอบ

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

ฉันเขียนโพสต์เกี่ยวกับวิธีเขียน testlib ที่สร้างชุดโปรแกรมสำหรับส่วนต่อประสานของคุณเอง

(โพสต์คำถามเดียวกันบนไซต์sqaด้วย)


6

มีเครื่องกำเนิดไฟฟ้าทดสอบหน่วย ตัวอย่างเช่นใน. NET โลกสิ่งเช่น Microsoft Pex สามารถทำได้

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


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

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