【问题标题】:how can I use assertRaises() in python's unittest to catch syntaxerror?如何在 python 的单元测试中使用 assertRaises() 来捕获语法错误?
【发布时间】:2014-12-27 04:49:37
【问题描述】:

例如,我想测试一个有语法的函数,在我的 unittest 类的方法中,我可以使用如下代码吗?

self.assertRaises(SyntaxError, my_function)

当我使用它时,它只是出现语法错误的回溯,而不是显示通过了多少测试。

【问题讨论】:

  • 你能显示错误吗?
  • Traceback(最近一次调用最后):文件“c:\Users\wy\Desktop\python\error_library.py”,第 58 行,在 语法错误:123a:c:\Users \wy\Desktop\python\error_library.py,第 58 行,位置 8
  • 这就像当我的模块中有我导入的函数的语法错误时,python 停止运行我运行的 unittest 模块。
  • 你为什么要断言你的代码语法错误?
  • 单元测试是您说模块应该包含语法错误的方式。那是你真正想要的吗?根据您的评论,我不确定。

标签: python exception syntax-error unit-testing


【解决方案1】:

为了运行测试,代码必须由 Python 解释器进行字节编译。这发生在导入包含您的函数的模块时,在函数运行之前。在编译过程中会产生 SyntaxError。

在您的测试模块中,您可以将导入语句包装在 try/except 中:

    raised = False
    try:
        import foo
    except SyntaxError:
        # A syntax error was generated during the import...
        raised = True
    self.assert_(raised, "'import foo' failed to raise a SyntaxError.")

或者使用@alecxe建议的方法之一,看起来更简单更干净。

【讨论】:

    【解决方案2】:

    按照 Warren Weckesser 的解释,您可以测试 import function 是否抛出错误:

    self.assertRaises(SyntaxError, __import__, "error_library")
    

    对于 Python 2.7 及更高版本,可以/应该使用importlib.import_module()

    self.assertRaises(SyntaxError, importlib.import_module, "error_library")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2018-08-18
      • 2012-12-21
      • 1970-01-01
      • 2015-03-24
      相关资源
      最近更新 更多