เป็นไปได้หรือไม่ที่การทดสอบหน่วยจะยืนยันว่าเมธอดเรียก sys.exit ()


99

ฉันมีเมธอด python 2.7 ที่บางครั้งเรียก

sys.exit(1) 

เป็นไปได้หรือไม่ที่จะทำการทดสอบหน่วยเพื่อยืนยันว่าบรรทัดของโค้ดนี้ถูกเรียกเมื่อตรงตามเงื่อนไข


คำตอบ:


156

ใช่. sys.exitเพิ่มขึ้นSystemExitเพื่อให้คุณสามารถตรวจสอบได้ด้วยassertRaises:

with self.assertRaises(SystemExit):
    your_method()

อินสแตนซ์ของSystemExitมีแอ็ตทริบิวต์codeที่ตั้งค่าเป็นสถานะการออกที่เสนอและตัวจัดการบริบทที่ส่งคืนโดยassertRaisesมีอินสแตนซ์ข้อยกเว้นที่ถูกจับได้exceptionดังนั้นการตรวจสอบสถานะการออกจึงทำได้ง่าย:

with self.assertRaises(SystemExit) as cm:
    your_method()

self.assertEqual(cm.exception.code, 1)

 

sys.exit เอกสารประกอบ :

ออกจาก Python สิ่งนี้ดำเนินการโดยเพิ่มSystemExitข้อยกเว้น ... เป็นไปได้ที่จะสกัดกั้นการพยายามออกจากระดับภายนอก


3
+1 ยกเว้นว่าถ้าเขาต้องการตรวจสอบว่ามันเรียกsys.exit(1)(ตรงข้ามกับพูดsys.exit(0)) คุณต้องยืนยันว่ามันcodeคือ 1 ฉันเดาว่าคุณสามารถทำได้ด้วยassertRaisesRegexp(SystemExit, '1')?
ยกเลิก

ผมแน่ใจว่ามีunittestวิธีการที่จะช่วยให้คุณผ่านการยกเว้นและกริยา callableให้ทำงานในข้อยกเว้นหรือ args ของมันมากกว่าแค่รูปแบบ regexในการทำงานในการเป็นตัวแทนสตริงของหาเรื่องครั้งแรก ... แต่ฉันเดาไม่ได้ มีโมดูลทดสอบอื่น ๆ ที่ฉันกำลังคิดอยู่หรือไม่?
ยกเลิก

1
+1 สำหรับการตรวจสอบรหัสข้อผิดพลาดนั้นง่ายกว่ามากที่จะทำเพียงแค่ self.assertRaisesRegex( SystemExit, '^2$', testMethod ) โค้ดน้อยลงอ่านได้เพียงพอ
Marek Lewandowski

1
@MarekLewandowski - พิมพ์ผิด ต้องเป็นself.assertRaisesRegexp
Evgen

12

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

import unittest
from glf.logtype.grinder.mapping_reader import MapReader

INCOMPLETE_MAPPING_FILE="test/data/incomplete.http.mapping"

class TestMapReader(unittest.TestCase):

    def test_get_tx_names_incomplete_mapping_file(self):
        map_reader = MapReader()
        with self.assertRaises(SystemExit) as cm:
            tx_names = map_reader.get_tx_names(INCOMPLETE_MAPPING_FILE)
        self.assertEqual(cm.exception.code, 1)

3

ฉันพบคำตอบสำหรับคำถามของคุณในการค้นหาเอกสาร Python Unit Testingสำหรับ "การทดสอบเพื่อข้อยกเว้น" จากตัวอย่างของคุณการทดสอบหน่วยจะมีลักษณะดังต่อไปนี้:

self.assertRaises(SystemExit, your_function, argument 1, argument 2)

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


1

หมายเหตุเพิ่มเติมสำหรับคำตอบที่ยอดเยี่ยมของ Pavel คุณสามารถตรวจสอบสถานะเฉพาะได้ว่ามีให้ในฟังก์ชันที่คุณกำลังทดสอบหรือไม่ ตัวอย่างเช่นหากyour_method()มีสิ่งต่อไปนี้sys.exit("Error")อาจเป็นไปได้ที่จะทดสอบ "ข้อผิดพลาด" โดยเฉพาะ:

with self.assertRaises(SystemExit) as cm:
    your_method()
    self.assertEqual(cm.exception, "Error")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.