在我的基于数组的列表实现中为append方法编写单元测试

时间:2018-05-03 18:54:01

标签: python unit-testing

我是Python的新手,我刚开始学习如何使用类。我实现了一个最大大小为50的基于数组的列表。我还有一个append方法,其中self.count引用列表中的下一个可用位置。现在我正在尝试为我的追加方法编写一个单元测试,但我想知道,除了追加50次之外,我如何检查断言错误?有没有办法手动更改我的self.count?

这是我的附加方法。

def append(self,item):
    assert self.count<=50
    if self.count>50:
        raise AssertionError("Array is full")
    self.array[self.count]=item
    self.count+=1

这是我为单元测试所尝试的内容:

def testAppend(self):
    a_list=List()
    a_list.append(2)
    self.assertEqual(a_list[0],2)
    # test for assertion error

任何帮助将不胜感激!

编辑:好的,在我意识到所有有用的建议后,我应该提出异常。

 def append(self,item):
    try:
        self.array[self.count]=item
    except IndexError:
        print('Array is full')
    self.count+=1

现在这是我的单元测试,但我收到了警告

Warning (from warnings module):
  File "C:\Users\User\Desktop\task1unitTest.py", line 57
   self.assertRaises(IndexError,a_list.append(6))
 DeprecationWarning: callable is None

.......

def testAppend(self):
    a_list=List()
    a_list.append(2)
    self.assertEqual(a_list[0],2)
    a_list.count=51
    self.assertRaises(IndexError,a_list.append(6))

2 个答案:

答案 0 :(得分:2)

不要直接调整count属性,只需将其附加50次即可获得完整列表。

def test_append_full(self):
    a = List()
    for i in range(50):
        a.append(i)
    with self.assertRaises(AssertionError):
        a.append(0)

这可确保您的测试不依赖于您如何限制列表大小的任何特定于实现的详细信息。假设您将List.append更改为从50倒数而不是从0开始计数?这个测试并不关心;无论你如何决定提出它,都会测试AssertionError

请注意,可以在运行时禁用断言;它们更适合调试。相反,当尝试附加到完整列表时,定义您自己的异常:

class ListFullError(RuntimeError):
    pass


def append(self,item):
    if self.count > 50:
        raise ListFullError
    self.array[self.count] = item
    self.count += 1

答案 1 :(得分:1)

如果你想要的只是测试self.count超过50的那一刻,你可以简单地将self.count设置为51:

a_list=List()
a_list.count = 51
a_list.append(2)

您的对象count属性设置为51,将引发异常。