如何在这个实例中使用Assert?

时间:2011-11-28 01:33:24

标签: python function assert

我正在尝试使用assert来检查另一个函数是否正常工作。

在这种情况下,我尝试测试的功能如下:

def factorial(n):
    if type(n) != int or n < 0:
        raise ValueError, "\nThis error has been raised because the value inputted was either not an integer or negative."
    else:   
        result = 1
        for x in range(n):
            result = result*(x+1)
        print "\n", n, "factorial is:", result

n = input("\n\n Insert a non-negative integer to take the factorial of: ")

factorial(n)

据我所知,如果我使用assert检查n = 1时的结果,我会使用:

assert factorial(1) == 1

然而,这会返回一个断言错误,虽然我已经用n = 1手动检查了函数并且它返回1,所以不应该因为条件为真而不引发断言错误吗?

有人能指出我为什么会收到断言错误吗?

还可以使用assert来检查引发的ValueError段是否正确吗?

3 个答案:

答案 0 :(得分:3)

您的阶乘函数打印结果,但它不会返回它。这就是断言失败的原因。试试这个:

def factorial(n):
    if not isinstance(n, int):
        raise ValueError('value must be an int')
    if n < 0:
        raise ValueError('n must be >= 0')

    result = 1
    for x in range(n):
        result = result * (x + 1)

    return result  # <-- This is the magic line :)

至于问题的第二部分,看起来你偶然发现unit testing

如果您想测试您的析因是否有效,我建议使用适当的单元测试库,例如doctestpytest。两者都非常易于使用,并且养成在代码中尽早编写测试的习惯。

这是doctest的一个例子:

def factorial(n):
    """Calculate the factorial of a non-negative integer ``n``.

    >>> factorial(1)
    1
    >>> factorial(4)
    24

    Negative numbers are not supported and will result in a ValueError:

    >>> factorial(-1)
    Traceback (most recent call last):
        ...
    ValueError: n must be >= 0

    """

    # (Insert original code here)


if __name__ == '__main__':
    import doctest
    doctest.testmod()

答案 1 :(得分:1)

您的所有函数似乎都打印出结果,因此实际函数返回的是None,因此assert factorial(1) == 1实际上被评估为assert None == 1,但失败了。从函数返回一个值,断言将不再失败。

答案 2 :(得分:1)

这里的问题是你没有为assert函数返回一个值来检查factorial函数返回的内容。

这就是我所做的:只是为了测试我只需添加一个return语句来返回结果。

>>> assert factorial(2)==1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> assert factorial(2)==2
>>> assert factorial(1)==1

def factorial(n):
    if type(n) != int or n < 0:
        raise ValueError, "\nThis error has been raised because the value inputted was either not an integer or negative."
    else:   
        result = 1
        for x in range(n):
            result = result*(x+1)
        return result

n = input("\n\n Insert a non-negative integer to take the factorial of: ")