关于在python中测试:在python中测试-如何在使用unittest的测试中使用assertRaises引发?

Testing in Python - how to use assertRaises in testing using unittest?

本问题已经有最佳答案,请猛点这里访问。

我正在尝试使用UnitTest在Python中执行一个简单的测试,以查看一个类如果得到不适合构造函数的输入,是否抛出异常。类如下所示:

1
2
3
4
5
6
7
8
9
10
11
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

我的测试如下:

1
2
3
4
5
6
    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)

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

另外,我应该使用什么类型的错误来处理这样的异常:一个不匹配的输入被我的regexp传递给构造函数?

谢谢你,托马斯


assertRaises有点混乱,因为您需要给它提供可调用的,而不是一个发出调用的表达式。

将代码更改为:

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

在代码中,您自己调用构造函数,它会引发一个关于没有足够参数的异常。相反,您需要给EDOCX1[1]可调用的(ukol1.summaryformula)和调用它的参数("testTest")。然后它可以调用它,捕捉并检查异常。


一种更为pythonic的方法是使用with命令(在python 2.7中添加):

1
2
with self.assertRaises(SomeException):
    do_something()

文档:https://docs.python.org/2/library/unittest.html unittest.testcase.assertraises


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

你路过的时候

1
ukol1.SummaryFormula()

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

1
ukol1.SummaryFormula(someSummaryFormula)

另外,混淆的地方在于类名是summaryformula,传递给__init__的参数也是summaryformula。

还是应该这样

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


更通用的替代格式是

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

如果您的构造函数是多态的,并且您希望循环遍历错误编写参数的不同方法的列表,例如:

1
2
3
4
5
6
7
arg_lists = [
    ['testtest'],
    ['anothertest'],
    ['YAT'],
]
for args in arg_lists:
    self.assertRaises(TypeError, ukol1.SummaryFormula, *args)

由于其他答案中没有一个指向如何使用封装导致异常的代码的上下文,下面介绍如何做到这一点。

1
2
3
4
5
with self.assertRaises(ValueError) as ctx:
    <some code that throws an exception>

expected_msg = 'foo_bar_baz'
self.assertEquals(ctx.exception.message, expected_msg)

在本文件中感兴趣的属性为:

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