【问题标题】:Testing in Python - how to use assertRaises in testing using unittest? [duplicate]用 Python 进行测试 - 如何在使用 unittest 的测试中使用 assertRaises? [复制]
【发布时间】:2011-04-22 02:03:11
【问题描述】:

我正在尝试使用 unittest 在 Python 中进行一个简单的测试,以查看一个类是否会在构造函数的输入不合适时引发异常。该类如下所示:

class SummaryFormula:
    def __init__( self, summaryFormula):
        self.atoms = {}
        for atom in re.finditer( "([A-Z][a-z]{0,2})(\d*)", summaryFormula):
            symbol = atom.group(1)
            count = atom.group(2)

            if pocet != "":
                self.atoms[ symbol] = int(count)
            else:
                self.atoms[ symbol] = 1

我的测试如下:

    class ConstructorTestCase(unittest.TestCase):
      def testEmptyString(self):
        self.assertRaises(TypeError, ukol1.SummaryFormula(), "testtest")

    if __name__ == '__main__':
      unittest.main()

我想要的只是测试失败,这意味着不处理构造函数输入不合适的异常。

相反,我收到一个错误:__init__() takes exactly 2 arguments (1 given)

我错过了什么?我应该指定的第二个参数是什么?

另外,我应该使用什么类型的错误来处理我的正则表达式不匹配的输入被传递给构造函数的异常?

谢谢你,托马斯

【问题讨论】:

  • 我无法直接运行代码,因为 for 循环附近有语法错误。你能纠正一下吗?
  • 我认为 for 循环周围的缩进不正确
  • @pyfunc:很抱歉。已更正。

标签: python unit-testing testing exception-handling


【解决方案1】:

assertRaises 有点令人困惑,因为您需要给它可调用的,而不是进行调用的表达式。

将您的代码更改为:

self.assertRaises(TypeError, ukol1.SummaryFormula, "testtest")

在您的代码中,您自己调用了构造函数,它会引发关于没有足够参数的异常。相反,您需要给assertRaises 可调用的(ukol1.SummaryFormula),以及调用它的参数(“testtest”)。然后它可以调用它,捕获并检查异常。

【讨论】:

    【解决方案2】:

    更 Python 的方式是使用 with 命令(在 Python 2.7 中添加):

    with self.assertRaises(SomeException):
        do_something()
    

    文档:https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertRaises

    【讨论】:

    • 这实际上非常棒。干净整洁。
    【解决方案3】:

    那是因为你的类在实例化对象时需要一个参数

    当你经过时

    ukol1.SummaryFormula()
    

    您应该已经将参数 summaryFormula 传递给它。

    ukol1.SummaryFormula(someSummaryFormula)
    

    另外混淆是因为你的类名是SummaryFormula,你传递给__init__的参数也是SummaryFormula

    或者应该是这样

    self.assertRaises(TypeError, ukol1.SummaryFormula, "testtest")
    

    【讨论】:

    • 这当然是我尝试的第一件事,但是如果我使用 self.assertRaises(TypeError, ukol1.SummaryFormula("testtest"), "testtest"),我会得到其他错误:SummaryFormula instance gas no call 方法。并且您不是将传递给在 assertRaises 中测试的函数的参数指定为 assertRaises() 函数的第三个(或第四个、第五个...)参数吗?
    • @Tomas Novotny :我在尝试运行您的代码时确实添加了第二个更改。在这里重复: self.assertRaises(TypeError, ukol1.SummaryFormula, "testtest")
    【解决方案4】:

    由于没有其他答案指出如何使用封装导致异常的代码的上下文,因此您可以这样做。

    with self.assertRaises(ValueError) as ctx:
        <some code that throws an exception>
    
    expected_msg = 'foo_bar_baz'
    self.assertEquals(ctx.exception.message, expected_msg)
    

    对此unittest.case._AssertRaisesContext 感兴趣的属性是:

    • 异常
    • 预计
    • expected_regexp
    • 失败异常

    【讨论】:

      【解决方案5】:

      更通用的替代格式是

      args=['testtest']
      kwargs = {}
      self.assertRaises(TypeError, ukol1.SummaryFormula, *args, **kwargs)
      

      如果您的构造函数是多态的,并且您想遍历一系列错误写入参数的不同方式,这很有用,例如:

      arg_lists = [
          ['testtest'],
          ['anothertest'],
          ['YAT'],
      ]
      for args in arg_lists:
          self.assertRaises(TypeError, ukol1.SummaryFormula, *args)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 2022-10-18
        • 2019-12-29
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多