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

Tra*_*ear 83 python unit-testing

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

sys.exit(1) 
Run Code Online (Sandbox Code Playgroud)

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

Pav*_*sov 132

是.sys.exit加注SystemExit,所以你可以检查assertRaises:

with self.assertRaises(SystemExit):
    your_method()
Run Code Online (Sandbox Code Playgroud)

实例SystemExit具有code设置为建议退出状态的属性,并且返回的上下文管理器assertRaises具有捕获的异常实例exception,因此检查退出状态很容易:

with self.assertRaises(SystemExit) as cm:
    your_method()

self.assertEqual(cm.exception.code, 1)
Run Code Online (Sandbox Code Playgroud)

 

sys.exit文档:

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

  • +1,除非他想验证它是否调用`sys.exit(1)`(而不是`sys.exit(0)`),你需要实际断言它的`code`是1.我猜你可以用`assertRaisesRegexp(SystemExit,'1')来做到这一点? (3认同)

Tra*_*ear 11

这是一个完整的工作示例.尽管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)
Run Code Online (Sandbox Code Playgroud)


小智 6

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

self.assertRaises(SystemExit, your_function, argument 1, argument 2)
Run Code Online (Sandbox Code Playgroud)

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