ความแตกต่างระหว่าง setUp () และ setUpClass () ใน Python unittest คืออะไร?


104

อะไรคือความแตกต่างระหว่างsetUp()และsetUpClass()ในunittestกรอบPython ? เหตุใดจึงต้องจัดการการตั้งค่าด้วยวิธีเดียว

ฉันต้องการที่จะเข้าใจในสิ่งที่เป็นส่วนหนึ่งของการติดตั้งจะทำในsetUp()และsetUpClass()ฟังก์ชั่นเช่นเดียวกับและtearDown()tearDownClass()

คำตอบ:


154

ความแตกต่างจะปรากฏขึ้นเมื่อคุณมีวิธีทดสอบมากกว่าหนึ่งวิธีในชั้นเรียนของคุณ setUpClassและtearDownClassจะถูกเรียกใช้ครั้งเดียวสำหรับทั้งชั้นเรียน setUpและtearDownจะรันก่อนและหลังวิธีการทดสอบแต่ละวิธี

ตัวอย่างเช่น:

class Example(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    def setUp(self):
        print("setUp")

    def test1(self):
        print("test1")

    def test2(self):
        print("test2")

    def tearDown(self):
        print("tearDown")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")

เมื่อคุณเรียกใช้การทดสอบนี้จะพิมพ์:

setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass

(จุด ( .) เป็นunittestเอาต์พุตเริ่มต้นเมื่อการทดสอบผ่านไป) สังเกตสิ่งนั้นsetUpและtearDownปรากฏก่อนและหลังtest1 และ test2ในขณะที่setUpClassและtearDownClassปรากฏเพียงครั้งเดียวที่จุดเริ่มต้นและจุดสิ้นสุดของกรณีทดสอบทั้งหมด


คำสั่งควรเป็นแบบนี้ไม่ใช่หรือ? : setUpClass setUp test1 tearDown .setUp test2 .tearDown tearDownClass
Jai Sharma

สังเกต "." ต่อหน้าฉีกขาดและไม่มี "." ด้านหน้าของ tearDownClass
Jai Sharma

อาขอโทษไม่ได้สังเกตเห็น ไม่มีunittestไม่ได้พิจารณาการทดสอบเพื่อผ่านไปจนtearDownได้เสร็จสิ้นโดยไม่เกิดอุบัติเหตุ
เบนจามินฮอดจ์สัน

ดังนั้นแต่ละวิธี test1 และ test2 ควรมี setUp & tearDown ของตัวเองใช่ไหม? ในคำตอบของคุณ test1 ไม่มีวิธีการฉีกขาดดังนั้นจึงควรพิมพ์เอาต์พุตเริ่มต้น (ด้วย.) ช่วยแก้ให้ด้วยนะถ้าฉันผิด.
Jai Sharma

1
ผลลัพธ์ในคำตอบนั้นถูกต้อง ฉันวางโดยตรงจากเอาต์พุตของ Unittest setUpและtearDownแต่ละครั้งจะรันหนึ่งครั้งสำหรับทุกtestวิธี (ดังนั้นรวมเป็นสองเท่าในตัวอย่างนี้) แต่setUpClassและtearDownClassจะรันเพียงครั้งเดียว
เบนจามินฮอดจ์สัน

16

อะไรคือความแตกต่างระหว่างsetUp()และsetUpClass()ในunittestกรอบPython ?

ความแตกต่างที่สำคัญ (ตามที่ระบุไว้ในคำตอบของเบนจามินฮอดจ์สัน) คือsetUpClassเรียกเพียงครั้งเดียวและก่อนการทดสอบทั้งหมดในขณะที่setUpจะเรียกทันทีก่อนการทดสอบแต่ละครั้งและทุกครั้ง (หมายเหตุ: เช่นเดียวกันกับวิธีการที่เทียบเท่าในกรอบการทดสอบ xUnit อื่น ๆ ไม่ใช่เฉพาะของ Python unittest)

จากunittest เอกสารประกอบ :

setUpClass()

มีการเรียกใช้เมธอดคลาสที่เรียกก่อนการทดสอบในแต่ละคลาส setUpClass ถูกเรียกด้วยคลาสเป็นอาร์กิวเมนต์เดียวและต้องตกแต่งเป็น classmethod ():

@classmethod
def setUpClass(cls):
    ...

และ:

setUp()

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

เหตุใดจึงต้องจัดการการตั้งค่าด้วยวิธีเดียว

คำถามส่วนนี้ยังไม่ได้รับคำตอบ ตามความคิดเห็นของฉันในการตอบสนองต่อคำตอบของ Gearon setUpวิธีนี้มีไว้สำหรับองค์ประกอบของฟิกซ์เจอร์ที่ใช้กันทั่วไปในการทดสอบทั้งหมด (เพื่อหลีกเลี่ยงการทำซ้ำรหัสนั้นในการทดสอบแต่ละครั้ง) ฉันพบว่าสิ่งนี้มักมีประโยชน์เนื่องจากการลบการทำซ้ำ (โดยปกติ) ช่วยเพิ่มความสามารถในการอ่านและลดภาระการบำรุงรักษา

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

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