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

Using assert raises unit testing in python

目前我正在为我的 class 函数编写单元测试。

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])

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

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

test1[2]是我的class中调用getitem函数的方法,类似于self[index]

我想知道我是否正确地断言加注? self.assertEqual 没问题。

断言抛出异常时应使用 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]

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

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

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

with self.assertRaises(IndexError):
    test1[4]

或使用多参数形式:

self.assertRaises(IndexError, test1.__getitem__, 4)