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

17 投票
5 回答
41460 浏览
提问于 2025-04-16 05:06

我正在用Python做一个简单的测试,使用的是'unittest'库,目的是看看一个类在接收到不合适的输入时,是否会抛出异常。这个类的代码是这样的:

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 two arguments (1 given)

我漏掉了什么呢?我应该指定的第二个参数是什么?

另外,我应该用什么类型的错误来处理传给构造函数的输入不符合我正则表达式的情况呢?

5 个回答

26

assertRaises 这个东西有点让人困惑,因为你需要给它一个可以调用的对象,而不是一个会执行调用的表达式。

把你的代码改成:

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

在你的代码里,你自己调用了构造函数,这样会引发一个关于参数不够的异常。其实,你应该把 assertRaises 传入一个可以调用的对象(比如 ukol1.SummaryFormula),然后再传入调用它所需的参数(比如 "testtest")。这样它就可以去调用这个对象,并捕捉和检查异常了。

28

一种更符合Python风格的方法是使用with命令(在Python 2.7中新增的):

with self.assertRaises(SomeException):
    do_something()

文档说明:assertRaises

13

这是因为你的类在创建对象的时候需要一个参数。

而你现在传入的是

ukol1.SummaryFormula()

你应该传入参数 summaryFormula。

ukol1.SummaryFormula(someSummaryFormula)

另外,造成困惑的原因是你的类名是 SummaryFormula,而你传给 __init__ 的参数也是 SummaryFormula。

或者应该是这样

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

撰写回答