我正在尝试使用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段是否正确吗?
答案 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。
如果您想测试您的析因是否有效,我建议使用适当的单元测试库,例如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()
答案 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: ")