在Python中测试 - 如何在使用unittest的测试中使用assertRaises?

Tom*_*tny 12 python testing unit-testing exception-handling

我试图使用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
Run Code Online (Sandbox Code Playgroud)

我的测试如下:

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

    if __name__ == '__main__':
      unittest.main()
Run Code Online (Sandbox Code Playgroud)

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

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

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

另外,我应该使用什么类型的错误来处理异常,即我的regexp无法匹配的输入被传递给构造函数?

托马斯,谢谢你

Ned*_*der 20

assertRaises 有点令人困惑,因为你需要给它可调用,而不是一个调用它的表达式.

将您的代码更改为:

self.assertRaises(TypeError, ukol1.SummaryFormula, "testtest")
Run Code Online (Sandbox Code Playgroud)

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


Pra*_*ush 16

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

with self.assertRaises(SomeException):
    do_something()
Run Code Online (Sandbox Code Playgroud)

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


pyf*_*unc 13

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

在你路过的时候

ukol1.SummaryFormula()
Run Code Online (Sandbox Code Playgroud)

你应该已经将参数summaryFormula传递给它.

ukol1.SummaryFormula(someSummaryFormula)
Run Code Online (Sandbox Code Playgroud)

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

或者应该这样

self.assertRaises(TypeError, ukol1.SummaryFormula, "testtest")
Run Code Online (Sandbox Code Playgroud)


Deb*_*Ray 7

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

with self.assertRaises(ValueError) as ctx:
    <some code that throws an exception>

expected_msg = 'foo_bar_baz'
self.assertEquals(ctx.exception.message, expected_msg)
Run Code Online (Sandbox Code Playgroud)

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

  • 例外
  • 预期的
  • 预期正则表达式
  • 失败异常