单元测试是否可以断言方法调用sys.exit()

时间:2013-03-28 00:29:34

标签: python unit-testing

我有一个python 2.7方法,有时会调用

sys.exit(1) 

是否可以进行单元测试,以便在满足正确条件时验证此代码行?

4 个答案:

答案 0 :(得分:114)

是。 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 Documentation

  

退出Python。这是通过提高SystemExit异常来实现的......可以拦截外层的退出尝试。

答案 1 :(得分:8)

这是一个完整的工作示例。尽管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)

答案 2 :(得分:1)

作为Pavel优秀答案的补充说明,如果您正在测试的功能中提供了特定状态,您还可以检查这些状态。例如,如果your_method()包含以下sys.exit("Error"),则可以专门测试“错误”:

with self.assertRaises(SystemExit) as cm:
    your_method()
    self.assertEqual(cm.exception, "Error")

答案 3 :(得分:1)

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

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

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