__init__ สำหรับ unittest.TestCase


122

ฉันต้องการเพิ่มบางสิ่งในสิ่งที่unittest.TestCaseชั้นเรียนทำเมื่อเริ่มต้น แต่ฉันคิดไม่ออกว่าจะทำอย่างไร

ตอนนี้ฉันกำลังทำสิ่งนี้:

#filename test.py

class TestingClass(unittest.TestCase):

    def __init__(self):
        self.gen_stubs()

    def gen_stubs(self):
        # Create a couple of tempfiles/dirs etc etc.
        self.tempdir = tempfile.mkdtemp()
        # more stuff here

ฉันต้องการให้สร้างต้นขั้วทั้งหมดเพียงครั้งเดียวสำหรับการทดสอบทั้งชุดนี้ ฉันไม่สามารถใช้งานได้setUpClass()เนื่องจากฉันกำลังทำงานกับ Python 2.4 (ฉันไม่สามารถทำงานบน python 2.7 ได้เช่นกัน)

ฉันทำอะไรผิดที่นี่?

ฉันได้รับข้อผิดพลาดนี้:

 `TypeError: __init__() takes 1 argument (2 given)` 

... และข้อผิดพลาดอื่น ๆ เมื่อฉันย้ายทั้งหมดของรหัสต้นขั้วลงเมื่อผมทำงานกับคำสั่ง__init__python -m unittest -v test


@ นีราชฉันคิดว่าคำถามของฉันก่อนวันที่หนึ่ง?
ffledgling

@Abhijeet คำถามนี้ถูกถามในปี 2013 คำถามที่คุณเชื่อมโยงถูกถามในปี 2016 และมีคำตอบและวาทกรรมน้อยกว่าคุณควรทำเครื่องหมายคำถามอื่นว่าซ้ำกันแทน? คำตอบคือ Python 3 เกี่ยวข้องและคำถามนี้พูดถึง Python 2
ffledgling

ขอโทษที่ฉันไม่ดี
Abhijeet

คำตอบ:


166

ลองสิ่งนี้:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

คุณกำลังลบล้างTestCaseของ__init__ดังนั้นคุณอาจต้องการปล่อยให้คลาสพื้นฐานจัดการอาร์กิวเมนต์ให้คุณ


+1 ฉันจะเริ่มต้นคลาสพื้นฐานก่อนที่จะเรียกใช้เมธอดอ็อบเจ็กต์ใด ๆ
Joachim Isaksson

สิ่งนี้ไม่ได้ผลสำหรับฉัน สิ่งที่อยู่ใน gen_stub จะไม่ถูกดำเนินการ Infact ดูเหมือนว่า gen_stub จะไม่ถูกเรียกเลย ... ฉันบอกได้เพราะ self.tempdir ที่ควรจะมีอยู่ไม่สามารถเข้าถึงได้ด้วยเมธอดอื่นของคลาส ฉันได้รับ AttributeError: วัตถุ 'TestingClass' ไม่มีแอตทริบิวต์ 'tempdir'
ffledgling

22
คุณไม่ควรเรียกสิ่งนี้setUpมากกว่าที่จะลบล้าง__init__?
karthikr

2
@karthikr ฉันต้องการสร้างต้นขั้วหนึ่งครั้งสำหรับการทดสอบทั้งหมดแทนที่จะสร้างขึ้นใหม่สำหรับการทดสอบทุกครั้ง การทดสอบบางส่วนจะไม่นำมาใช้ด้วยซ้ำ ฉันจะใช้ setUpClass แต่ฉันไม่คิดว่า python 2.4 รองรับ
ffledgling

2
คุณสามารถอธิบายให้ชัดเจนขึ้นอีกนิดในกรณีนี้ (ซึ่งช่วยให้อ่านง่ายในความคิดของฉัน) และใช้: unittest.TestCase.__init__(self,*args,**kwargs)แทนsuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo

22

แค่ต้องการเพิ่มคำชี้แจงเกี่ยวกับการแทนที่ฟังก์ชัน init ของ

unittest.TestCase

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

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

ฟังก์ชันนี้จะถูกเรียกหนึ่งครั้งก่อนวิธีการทดสอบทั้งหมดของคลาส ดูsetUpวิธีการที่เรียกก่อนแต่ละวิธีการทดสอบ


4

ติดตั้ง unittest2 และใช้แพคเกจที่ไม่เหมาะสมที่สุด

import unittest2 

จากนั้นใช้คลาส setupModule / tearDownModule หรือ setupClass / tearDown สำหรับตรรกะการเริ่มต้นพิเศษ

ข้อมูลเพิ่มเติม: http://www.voidspace.org.uk/python/articles/unittest2.shtml

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


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