有人可以解释令人困惑的unittest代码吗?

时间:2013-04-12 09:25:15

标签: python unit-testing

这是为其编写的单元测试函数:

def swap_k(L, k):
    """ (list, int) -> NoneType

    Precondtion: 0 <= k <= len(L) // 2

    Swap the first k items of L with the last k items of L.

    >>> nums = [1, 2, 3, 4, 5, 6]
    >>> swap_k(nums, 2)
    >>> nums
    [5, 6, 3, 4, 1, 2]
    """

这是单位测试代码:

def test_swap_k_list_length_6_swap_2(self):
    """Test swap_k with list of length 6 and number of items to swap 2.
    Also allow for the fact that there are potentially four alternate
    valid outcomes.
    """

    list_original = [1, 2, 3, 4, 5, 6]
    list_outcome_1 = [5, 6, 3, 4, 1, 2]
    list_outcome_2 = [5, 6, 3, 4, 2, 1]
    list_outcome_3 = [6, 5, 3, 4, 1, 2]
    list_outcome_4 = [6, 5, 3, 4, 2, 1]
    valid_outcomes = [list_outcome_1, list_outcome_2, list_outcome_3, list_outcome_4]
    k = 2

    a1.swap_k(list_original,k)

    self.assertIn(list_original, valid_outcomes)
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

单元测试代码通过,我不明白为什么因为我认为唯一有效的结果是list_outcome_1,以swap_k的文档字符串判断......

2 个答案:

答案 0 :(得分:5)

首先,即使“valid_outcomes”包含 more 而非有效,测试也可以通过。 (在您看来,list_outcome_1)。它只是意味着它有时不会失败

其次,我认为测试是正确的:doc没有说第一个“k”项目将按原始顺序排在最后,也不保证最后一个“k”项目的相同。所以[1,2]的任何顺序都可以出现在列表的末尾,[5,6]的任何顺序都可以出现在开头。

一般情况下,如果某些事情得不到保证,那么即使看起来合乎逻辑,我也不愿意这样做(毕竟,列表是有序的,所以假设这种情况几乎是自然的。)

“修复”单元测试也意味着修复文档以保证订单。

答案 1 :(得分:0)

self.assertEqual(list_original, list_outcome_1)

self.assertIn(list_original, valid_outcomes)

都满足测试。在这里,您正在测试真实结果是否在结果列表中是真的,因此测试是有效的。

但是根据docstring

    self.assertEqual(list_original, list_outcome_1)

会更好,因为它会检查相等性。