使用assert在python中引发单元测试

Max*_*xxx 4 python unit-testing exception-handling

目前我正在为我的班级功能编写单元测试.

def test_getitem(self):
    test1 = List(3)
    for i in range(3):
        test1.append(i)
    self.assertEqual(test1[2], 2)

    test1 = List(3)
    for i in range(3):
        test1.append(i)
    self.assertRaises(IndexError, test1[4])
Run Code Online (Sandbox Code Playgroud)

我现在遇到的问题是self.assertRaises我的代码部分.我不确定这是不是这样做但是当我运行时unittest,它会产生错误Index out of range.顺便说一下,它应该是"OK".

List是我的类,并List(3)创建一个基于数组的列表.所以,当我test1.append(i),它现在[0,1,2].

test1[2]是一种getitem在我的类中调用函数的方法self[index].

我想知道我是否断言正确提升?self.assertEqual很好.

AK4*_*K47 5

with当您断言抛出异常时,您应该使用该语句

def test_getitem(self):
    test1 = List(3)
    for i in range(3):
        test1.append(i)
    self.assertEqual(test1[2], 2)

    test1 = List(3)
    for i in range(3):
        test1.append(i)
    with self.assertRaises(IndexError):
        test1[4]
Run Code Online (Sandbox Code Playgroud)


MSe*_*ert 5

在调用函数之前计算参数,因此在调用函数之前test1[4]执行它self.assertRaises.所以它无法捕获异常.

这也是2参数形式具有签名的原因assertRaises(exception, msg=None),这里的第二个参数是要匹配的"msg",而不是要调用的函数.所以在任何情况下它都不会做正确的事情.

您可以使用上下文管理器:

with self.assertRaises(IndexError):
    test1[4]
Run Code Online (Sandbox Code Playgroud)

或者使用多参数形式:

self.assertRaises(IndexError, test1.__getitem__, 4)
Run Code Online (Sandbox Code Playgroud)