อธิบายเมธอด Python“ setUp” และ“ tearDown” ที่ใช้ในกรณีทดสอบ


96

ใครสามารถอธิบายการใช้ Python setUpและtearDownวิธีการในขณะที่เขียนกรณีทดสอบนอกเหนือจากที่setUpเรียกว่าทันทีก่อนที่จะเรียกใช้วิธีการทดสอบและtearDownจะถูกเรียกทันทีหลังจากที่ถูกเรียก

คำตอบ:


87

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

คุณสามารถอ่านเพิ่มเติมกับตัวอย่างที่นี่

เมื่อกำหนดเมธอด setUp () นักวิ่งทดสอบจะเรียกใช้วิธีนั้นก่อนการทดสอบแต่ละครั้ง ในทำนองเดียวกันถ้ามีการกำหนดวิธีการ tearDown () นักวิ่งทดสอบจะเรียกใช้เมธอดนั้นหลังจากการทดสอบแต่ละครั้ง

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

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

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

คุณสามารถสร้าง setUp และ tearDown สำหรับการทดสอบจำนวนมากและกำหนดไว้ในคลาสหลักได้ดังนั้นจึงเป็นเรื่องง่ายสำหรับคุณที่จะสนับสนุนการทดสอบดังกล่าวและอัปเดตการเตรียมการทั่วไปและการทำความสะอาด

หากคุณกำลังมองหาตัวอย่างง่ายๆโปรดใช้ลิงค์ต่อไปนี้พร้อมตัวอย่าง


57

คุณสามารถใช้สิ่งเหล่านี้เพื่อแยกรหัสทั่วไปออกจากการทดสอบทั้งหมดในชุดทดสอบ

หากคุณมีรหัสซ้ำจำนวนมากในการทดสอบของคุณคุณสามารถทำให้สั้นลงได้โดยการย้ายรหัสนี้ไปที่ setUp / tearDown

คุณอาจใช้สิ่งนี้ในการสร้างข้อมูลทดสอบ (เช่นการตั้งค่าของปลอม / ล้อเลียน) หรือการตัดฟังก์ชันด้วยของปลอม

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

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

class TurretTest(unittest.TestCase):

    def setUp(self):
        self.turret_factory = TurretFactory()
        self.turret = self.turret_factory.CreateTurret()

    def test_turret_is_on_by_default(self):
        self.assertEquals(True, self.turret.is_on())

    def test_turret_turns_can_be_turned_off(self):
        self.turret.turn_off()
        self.assertEquals(False, self.turret.is_on())

17
+1 เพราะโค้ด 9 บรรทัดคือทั้งหมดที่ฉันต้องการเพื่อให้มั่นใจได้ 100% ตัวอย่างที่หรูหราและกระชับ บอกตามตรงว่า 9 บรรทัดนี้เป็นสิ่งเดียวที่ฉันอ่านในหน้านี้นอกเหนือจากคำถามซึ่งเป็นคำถามของฉันด้วย คุณเคยพูดอะไรเป็นภาษาอังกฤษก่อนตัวอย่างโค้ดหรือไม่? ไม่จำเป็น! โค้ดบอกเลย! ขอบคุณ Matt
Nathan C. Tresch

3
ฉันไม่ทราบแน่ชัดว่า "ข้ามการทดสอบหากตั้งค่าบางอย่างไม่ถูกต้อง" ได้อย่างไรที่นี่ หรือว่าเป็นแค่การกัน?
user5359531

6

สมมติว่าคุณมีชุดทดสอบ 10 ชุด การทดสอบ 8 รายการใช้รหัสการตั้งค่า / การฉีกขาดเดียวกัน อีก 2 อย่า

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


1
บางครั้งก็ไม่ต้องการที่จะย้ายการทดสอบไปยังกล่องทดสอบอื่น ในกรณีนี้คุณสามารถเขียนมัณฑนากรด้วยรหัสการตั้งค่า / การฉีกขาดและตกแต่งเฉพาะฟังก์ชันการทดสอบที่ต้องการเท่านั้น
Matthijs

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