ฉันมีเมธอด python 2.7 ที่บางครั้งเรียก
sys.exit(1)
เป็นไปได้หรือไม่ที่จะทำการทดสอบหน่วยเพื่อยืนยันว่าบรรทัดของโค้ดนี้ถูกเรียกเมื่อตรงตามเงื่อนไข
ฉันมีเมธอด python 2.7 ที่บางครั้งเรียก
sys.exit(1)
เป็นไปได้หรือไม่ที่จะทำการทดสอบหน่วยเพื่อยืนยันว่าบรรทัดของโค้ดนี้ถูกเรียกเมื่อตรงตามเงื่อนไข
คำตอบ:
ใช่. 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)
ออกจาก Python สิ่งนี้ดำเนินการโดยเพิ่ม
SystemExitข้อยกเว้น ... เป็นไปได้ที่จะสกัดกั้นการพยายามออกจากระดับภายนอก
sys.exit(1)(ตรงข้ามกับพูดsys.exit(0)) คุณต้องยืนยันว่ามันcodeคือ 1 ฉันเดาว่าคุณสามารถทำได้ด้วยassertRaisesRegexp(SystemExit, '1')?
unittestวิธีการที่จะช่วยให้คุณผ่านการยกเว้นและกริยา callableให้ทำงานในข้อยกเว้นหรือ args ของมันมากกว่าแค่รูปแบบ regexในการทำงานในการเป็นตัวแทนสตริงของหาเรื่องครั้งแรก ... แต่ฉันเดาไม่ได้ มีโมดูลทดสอบอื่น ๆ ที่ฉันกำลังคิดอยู่หรือไม่?
self.assertRaisesRegex( SystemExit, '^2$', testMethod ) โค้ดน้อยลงอ่านได้เพียงพอ
self.assertRaisesRegexp
นี่คือตัวอย่างการทำงานที่สมบูรณ์ แม้ว่า 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)
ฉันพบคำตอบสำหรับคำถามของคุณในการค้นหาเอกสาร Python Unit Testingสำหรับ "การทดสอบเพื่อข้อยกเว้น" จากตัวอย่างของคุณการทดสอบหน่วยจะมีลักษณะดังต่อไปนี้:
self.assertRaises(SystemExit, your_function, argument 1, argument 2)
อย่าลืมใส่อาร์กิวเมนต์ทั้งหมดที่จำเป็นในการทดสอบฟังก์ชันของคุณ
หมายเหตุเพิ่มเติมสำหรับคำตอบที่ยอดเยี่ยมของ Pavel คุณสามารถตรวจสอบสถานะเฉพาะได้ว่ามีให้ในฟังก์ชันที่คุณกำลังทดสอบหรือไม่ ตัวอย่างเช่นหากyour_method()มีสิ่งต่อไปนี้sys.exit("Error")อาจเป็นไปได้ที่จะทดสอบ "ข้อผิดพลาด" โดยเฉพาะ:
with self.assertRaises(SystemExit) as cm:
your_method()
self.assertEqual(cm.exception, "Error")