如何在此情况下使用Assert?

1 投票
3 回答
1003 浏览
提问于 2025-04-17 07:11

我正在尝试使用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 个回答

1

这里的问题是,你没有给assert函数返回一个值来检查factorial函数返回的结果。

我做了这个:为了测试,我简单地添加了一个返回语句来返回结果。

>>> 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: ")
1

你这个函数似乎只是把结果打印出来,所以它实际上返回的是None(什么都没有)。这样一来,assert factorial(1) == 1 实际上是在比较 assert None == 1,这就失败了。要让这个断言不再失败,你需要让函数返回一个值。

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 :)

至于问题的第二部分,看起来你遇到了单元测试

如果你想测试你的阶乘函数是否有效,我建议使用一个合适的单元测试库,比如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()

撰写回答