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


Answers:


155

是。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')?来做到这一点。
abarnert 2013年

我确信有一个unittest方法可以让您传递异常和可调用谓词,以在异常或其args上运行,而不是仅在其第一个arg的字符串表示形式上运行的正则表达式模式 …但是我想不是。我在想其他的测试模块吗?
abarnert

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单元测试文档搜索“测试异常”中找到了您问题的答案。使用您的示例,单元测试如下所示:

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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.