unit testing是否有可能声明一个方法调用sys.exit()

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

sys.exit(1) 

是否有可能进行unit testing,validation这条代码被称为满足正确的条件时?

是。 sys.exit引发了SystemExit ,所以你可以用assertRaises来检查它:

 with self.assertRaises(SystemExit): your_method() 

SystemExit实例具有设置为build议退出状态的属性code ,并且由assertRaises返回的上下文pipe理器将捕获到的exception实例作为exception ,因此检查退出状态非常简单:

 with self.assertRaises(SystemExit) as cm: your_method() self.assertEqual(cm.exception.code, 1) 

sys.exit文档 :

从Python退出。 这是通过提高SystemExitexception来实现的……可以在外层拦截退出尝试。

这是一个完整的工作示例。 尽pipe帕维尔的回答非常好,但是我花了一段时间才弄明白这一点,所以我在这里包括它,希望这会有所帮助。

 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) 

作为Pavel优秀答案的附加说明,如果您正在testing的函数中提供了特定的状态,您还可以检查它们。 例如,如果your_method()包含以下sys.exit("Error")则可以专门testing“Error”:

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

我在Pythonunit testing文档search“Testing for Exceptions”中find了你的问题的答案。 用你的例子,unit testing看起来像下面这样:

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

请记住包含testing您的function所需的所有参数。