如何在此情况下使用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 个回答
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 :)
至于问题的第二部分,看起来你遇到了单元测试。
如果你想测试你的阶乘函数是否有效,我建议使用一个合适的单元测试库,比如doctest或pytest。这两个库都非常容易使用,而且在写代码的早期就养成写测试的习惯是很好的。
这里有一个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()