测试不纯的函数

时间:2015-09-28 15:44:03

标签: python python-2.7 testing

作为在线编程课程(6.00.1x)的一部分,我被要求(Quiz p8)创建一个功能satisfiesF(L),可以就地L进行过滤使用f,然后返回L的长度。

  • f是为我定义的函数,它返回True应保留在列表中的项目
  • 其余列表项应与之前的顺序相同

我已经为这个问题编写了2个解决方案,测试了它们并提交了它们,但两者都被拒绝了。没有提供任何理由,因为该问题旨在测试我们提出自己的测试用例的能力。出于这个原因,请不要提供工作代码,而是让我大致了解出了什么问题。我现在看到了三种主要的可能性:

  • 我误解了这个问题
  • 我犯了一个微妙的编程错误
  • edX对他们的测试用例(不太可能)
  • 犯了一个错误

以下是我的2个解决方案:

def satisfiesF(L):
    L[:] = [i for i in L if f(i)]
    return len(L)

def satisfiesF(L):
    i = 0
    while len(L) > i:
        if f(L[i]): i += 1
        else: L.pop(i)
    return len(L)

以下是问题的完整描述:

  

编写一个名为satisfiesF的Python函数,该函数具有该规范   下面。然后进行函数调用run_satisfiesF(L, satisfiesF)。您的   代码应如下所示:

def satisfiesF(L):
    """
    Assumes L is a list of strings
    Assume function f is already defined for you and it maps a string to a Boolean
    Mutates L such that it contains all of the strings, s, originally in L such
            that f(s) returns True, and no other elements. Remaining elements in L
            should be in the same order.
    Returns the length of L after mutation
    """
    # Your function implementation here

run_satisfiesF(L, satisfiesF)
     

例如,对于您自己的satisfiesF测试,请参阅以下测试函数f和测试代码:

def f(s):
    return 'a' in s

L = ['a', 'b', 'a']
print satisfiesF(L)
print L
     

应打印:

2
['a', 'a']
     

在下面的框中粘贴整个函数satisfiesF,包括定义。定义函数后,对run_satisfiesF(L, satisfiesF)进行函数调用。不要定义frun_satisfiesF。不要留下任何调试打印语句。

     

对于这个问题,您将无法看到我们运行的测试用例。此问题将测试您是否有能力提出自己的测试用例。

而且,为了完整起见,这是我最新的一组测试(我正在使用doctest):

>>> L = ['bat', 'cat', 'dog', 'elephant']
>>> satisfiesF(L) == len([i for i in L if f(i)])
True
>>> [i for i in L if not f(i)]
[]
>>> L = ['ab', 'b', 'ac']
>>> satisfiesF(L)
2
>>> L
['ab', 'ac']
>>> L = ['a', 'a', 'b']
>>> satisfiesF(L)
2
>>> L
['a', 'a']
>>> L = ['a', 'a', 'a']
>>> satisfiesF(L)
3
>>> L
['a', 'a', 'a']
>>> L = ['b', 'c', 'd', 'a']
>>> satisfiesF(L)
1
>>> L
['a']

这些测试使用问题中建议的def f(s): return 'a' in s。我没有使用f的其他函数进行测试,但我认为这不会影响结果。

我尝试用satisfiesF(L)替换run_satisfiesF(L, satisfiesF),但测试仍然通过。

Other questions about 6.00.1x Quiz p8

证明我并不疯狂:

answer to Quiz p8 marked incorrect

1 个答案:

答案 0 :(得分:1)

我无法重现你的问题:

第二

enter image description here

首先也检查出来。

我正在思考的那个:

for i in range(len(L)-1,-1,-1):
    if f(L[i]) != True:
        del(L[i])
return len(L)

同时退房。