อะไรคือความแตกต่างระหว่างsetUp()
และsetUpClass()
ในunittest
กรอบPython ?
ความแตกต่างที่สำคัญ (ตามที่ระบุไว้ในคำตอบของเบนจามินฮอดจ์สัน) คือsetUpClass
เรียกเพียงครั้งเดียวและก่อนการทดสอบทั้งหมดในขณะที่setUp
จะเรียกทันทีก่อนการทดสอบแต่ละครั้งและทุกครั้ง (หมายเหตุ: เช่นเดียวกันกับวิธีการที่เทียบเท่าในกรอบการทดสอบ xUnit อื่น ๆ ไม่ใช่เฉพาะของ Python unittest
)
จากunittest
เอกสารประกอบ :
setUpClass()
มีการเรียกใช้เมธอดคลาสที่เรียกก่อนการทดสอบในแต่ละคลาส setUpClass ถูกเรียกด้วยคลาสเป็นอาร์กิวเมนต์เดียวและต้องตกแต่งเป็น classmethod ():
@classmethod
def setUpClass(cls):
...
และ:
setUp()
วิธีการที่เรียกว่าเพื่อเตรียมอุปกรณ์ทดสอบ สิ่งนี้ถูกเรียกทันทีก่อนที่จะเรียกใช้วิธีการทดสอบ นอกเหนือจาก AssertionError หรือ SkipTest ข้อยกเว้นใด ๆ ที่เพิ่มขึ้นโดยวิธีนี้จะถือว่าเป็นข้อผิดพลาดแทนที่จะเป็นความล้มเหลวในการทดสอบ การใช้งานเริ่มต้นไม่ทำอะไรเลย
เหตุใดจึงต้องจัดการการตั้งค่าด้วยวิธีเดียว
คำถามส่วนนี้ยังไม่ได้รับคำตอบ ตามความคิดเห็นของฉันในการตอบสนองต่อคำตอบของ Gearon setUp
วิธีนี้มีไว้สำหรับองค์ประกอบของฟิกซ์เจอร์ที่ใช้กันทั่วไปในการทดสอบทั้งหมด (เพื่อหลีกเลี่ยงการทำซ้ำรหัสนั้นในการทดสอบแต่ละครั้ง) ฉันพบว่าสิ่งนี้มักมีประโยชน์เนื่องจากการลบการทำซ้ำ (โดยปกติ) ช่วยเพิ่มความสามารถในการอ่านและลดภาระการบำรุงรักษา
setUpClass
วิธีการสำหรับองค์ประกอบราคาแพงที่คุณจะค่อนข้างจะต้องทำเพียงครั้งเดียวเช่นการเปิดการเชื่อมต่อฐานข้อมูลเปิดแฟ้มชั่วคราวในระบบแฟ้มโหลดห้องสมุดสาธารณะสำหรับการทดสอบ ฯลฯ ทำสิ่งดังกล่าวก่อนการทดสอบแต่ละครั้งจะชะลอตัวลง ชุดทดสอบมากเกินไปดังนั้นเราจึงทำครั้งเดียวก่อนการทดสอบทั้งหมด นี่เป็นการลดระดับเล็กน้อยในความเป็นอิสระของการทดสอบ แต่เป็นการเพิ่มประสิทธิภาพที่จำเป็นในบางสถานการณ์ โดยทั่วไปแล้วเราไม่ควรทำสิ่งเหล่านี้ในการทดสอบหน่วยเนื่องจากโดยปกติแล้วจะสามารถล้อเลียนฐานข้อมูล / ระบบไฟล์ / ไลบรารี / อะไรก็ได้โดยไม่ใช้ของจริง ดังนั้นฉันจึงพบว่าsetUpClass
แทบไม่จำเป็น อย่างไรก็ตามจะมีประโยชน์เมื่อจำเป็นต้องทดสอบตัวอย่างข้างต้น (หรือที่คล้ายกัน)