112

我有一个有时调用的 Python 2.7 方法

sys.exit(1)

是否可以进行单元测试来验证在满足正确条件时调用这行代码?

4

4 回答 4

185

是的。sys.exitraises 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异常来实现的……可以在外部级别拦截退出尝试。

于 2013-03-28T00:30:49.900 回答
15

这是一个完整的工作示例。尽管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)
于 2013-03-28T01:10:54.750 回答
8

我在Python 单元测试文档中搜索“Testing for Exceptions”找到了您问题的答案。使用您的示例,单元测试将如下所示:

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

请记住包含测试函数所需的所有参数。

于 2015-12-01T22:44:01.663 回答
3

作为对Pavel 出色答案的附加说明,如果您正在测试的功能中提供了特定状态,您还可以检查它们。例如,如果your_method()包含以下内容sys.exit("Error"),则可以专门测试“错误”:

with self.assertRaises(SystemExit) as cm:
    your_method()
    self.assertEqual(cm.exception, "Error")
于 2014-01-27T04:18:12.827 回答