ทำไม xUnit frameworks ไม่อนุญาตให้ทำการทดสอบแบบขนาน?


15

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

หากไม่มี (หรือน้อยคน) ที่ทำมันอาจจะมีเหตุผล ... นั่นเป็นเพราะการทดสอบนั้นรวดเร็วมากหรือเปล่าที่คนทั่วไปไม่รู้สึกว่าจำเป็นต้องทำให้เป็นอัมพาต

มีบางสิ่งที่ลึกกว่าที่ขัดขวางการกระจาย (อย่างน้อยบางส่วน) การทดสอบในหลายเธรดหรือไม่


การทดสอบหน่วยช้าแน่นอน แม้ว่าการทดสอบแต่ละครั้งจะเร็ว แต่พวกเขาก็สะสมเพราะผู้คนมีกรณีทดสอบนับล้าน
Pacerier

คำตอบ:


6

NUnit 2.5 ที่รวม pNUnit ซึ่งอนุญาตให้เรียกใช้การทดสอบแบบขนาน

ข่าวประชาสัมพันธ์ฉบับนี้รวมถึง pNUnit, นักวิ่ง NUnit เพิ่มเติมสำหรับการทดสอบแบบกระจาย โปรแกรม pNUnit ได้รับการพัฒนาที่ Codice Software เพื่อใช้ในการทดสอบ Plastic SCM และได้รับการสนับสนุนให้ NUnit สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ pNUnit ดูไซต์ pNUnit

ด้าน JUnit มีขนาน junitเช่นเดียวกับอะมิโน


ดังนั้นเหตุผลเดียวสำหรับกรอบอื่น ๆ ก็คือ 'ยังไม่ได้ใช้งาน'
ซาเวีย

1
@ Xavier ใช่; นั่นคือคำแถลงที่ยุติธรรม
Aaron McIver

10

ในการตอบคำถามที่สองของคุณ: มีบางสิ่งที่ลึกซึ้งกว่าที่ห้ามการทดสอบ (อย่างน้อยบางส่วน) ในการทดสอบหลายเธรดหรือไม่

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

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

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


+1 นี่คือคำตอบที่ได้รับการยกเว้นเพราะจริง ๆ แล้วมันตอบว่าทำไม
Oliver Weiler

4

หากการทดสอบจำเป็นต้องตั้งค่าและสอบถามฐานข้อมูลการทดสอบที่ทำงานแบบขนานจะรบกวนซึ่งกันและกันเว้นแต่ว่าจะมีฐานข้อมูลแยกต่างหากสำหรับการทดสอบแต่ละครั้งที่ทำงานแบบขนาน


นั่นไม่ใช่สำหรับแพลตฟอร์มการทดสอบ (xUnit) ที่จะต้องใส่ใจ นั่นคือรายละเอียดการใช้งาน
Aaron McIver

และไม่ใช่การทดสอบทั้งหมดที่เขียนในกรอบการทดสอบหน่วยคือการทดสอบหน่วยเช่นเดียวกับการเข้าถึงฐานข้อมูลไม่ใช่การทดสอบหน่วยจริง ๆ เหมือนกับการทดสอบการรวม
c_maker

เพียงเพราะการทดสอบสัมผัสกับฐานข้อมูลไม่ได้หมายความว่าเป็นการทดสอบการรวมระบบ วิธีการที่รันบางส่วนใน C # และบางส่วนใน sproc ฐานข้อมูลยังคงเป็นแนวคิดการทดสอบหน่วยตราบใดที่ไม่คาดว่าจะมีการกำหนดค่าล่วงหน้า (เช่น schema ของข้อมูลมีอยู่ แต่ไม่มีข้อมูลอยู่) การทดสอบดังกล่าวอาจสร้างข้อมูลสำหรับการวิ่งเดี่ยว แต่ควรรีเซ็ตเป็นสถานะว่างเมื่อเสร็จสิ้น) นี่อาจเป็นความเห็นแย้ง แต่การทดสอบดังกล่าวไม่สามารถพิจารณาว่าเป็นการทดสอบการรวมเข้าด้วยกันเพราะเป็นการทดสอบ zero-config อย่างชัดเจนการทดสอบ zero-deploy ที่ทดสอบหน่วยโค้ดขนาดเล็ก
Triynko

2

ในขณะที่ JUnit ต่อ se อาจไม่อนุญาต (ฉันไม่คุ้นเคยกับรุ่นล่าสุดของมัน), Maven กับ Surefire plugin มีตัวเลือกในการรันการทดสอบแบบขนาน ฉันยังไม่ได้ลองเลย

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


0

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

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

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

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


0

MBUnit สามารถเรียกใช้การทดสอบแบบขนานได้ง่ายๆโดยการระบุแอตทริบิวต์ระดับแอสเซมบลีบางอย่าง

[assembly: DegreeOfParallelism(6)]
[assembly: Parallelizable(TestScope.All)]

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

xUnit 2.0 ควรสนับสนุนการทดสอบยูนิตแบบขนาน แต่ฉันยังไม่ได้ลองเลย

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