【问题标题】:Is it possible for a unit test to assert that a method calls sys.exit()?单元测试是否可以断言方法调用 sys.exit()?
【发布时间】:2013-03-18 07:39:38
【问题描述】:

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

sys.exit(1)

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

【问题讨论】:

标签: python unit-testing


【解决方案1】:

是的。 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,除非他想验证它是否调用了sys.exit(1)(而不是sys.exit(0)),你需要实际断言它的code 是1。我猜你assertRaisesRegexp(SystemExit, '1') 可以做到这一点吗?
  • 我确信有一个 unittest 方法可以让您传递一个异常和一个 可调用谓词 以在异常或其参数上运行,而不仅仅是一个 regex 模式 在其第一个 arg 的字符串表示上运行……但我猜不是。还有其他一些我在考虑的测试模块吗?
  • +1,至于检查错误代码要简单得多:self.assertRaisesRegex( SystemExit, '^2$', testMethod ) 代码少,可读性强。
  • @MarekLewandowski - 错字。必须是self.assertRaisesRegexp
【解决方案2】:

这是一个完整的工作示例。尽管有Pavel's excellent answer,但我还是花了一些时间才弄清楚这一点,所以我把它包括在这里,希望它会有所帮助。

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

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

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

    【讨论】:

      【解决方案4】:

      作为对Pavel's excellent answer 的附加说明,如果您正在测试的函数中提供了特定状态,您还可以检查它们。例如,如果your_method() 包含以下sys.exit("Error"),则可以专门测试“错误”:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-03
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        相关资源
        最近更新 更多