我有一个有时调用的 Python 2.7 方法
sys.exit(1)
是否可以进行单元测试来验证在满足正确条件时调用这行代码?
是的。sys.exit
raises 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
异常来实现的……可以在外部级别拦截退出尝试。
这是一个完整的工作示例。尽管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 单元测试文档中搜索“Testing for Exceptions”找到了您问题的答案。使用您的示例,单元测试将如下所示:
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")