这是为其编写的单元测试函数:
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的文档字符串判断......
答案 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)
会更好,因为它会检查相等性。