简体   繁体   English

在这种情况下如何使用Assert?

[英]How to use Assert in this instance?

I'm trying to use assert to check if another function is working correctly. 我正在尝试使用assert来检查另一个函数是否正常工作。

In this case the function I am trying to test is the following: 在这种情况下,我要测试的功能如下:

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)

As far as I was aware if I was using assert to check the result of when n=1 I would use: 据我所知,如果我使用assert来检查n = 1的结果,我将使用:

assert factorial(1) == 1

However this returns an assertion error although I have checked the function manually with n=1 and it DOES return 1, so shouldn't it not raise the assertion error as the conditon is true? 但这会返回一个断言错误,尽管我已经用n = 1手动检查了该函数,并且确实返回了1,所以不应该因为条件为真而引发断言错误?

Could anyone point out why I am getting an assertion error raised? 谁能指出为什么我收到断言错误?

Also is it possible to use assert to check for the whether raise ValueError segment is correct? 也可以使用assert来检查是否引发ValueError段是否正确?

Your factorial function prints the result, but it does not return it. 您的阶乘函数可打印结果,但不会返回结果。 This is why the assertion fails. 这就是断言失败的原因。 Try this: 尝试这个:

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

As for the second part of the question, it looks like you've stumbled on unit testing . 至于问题的第二部分,您似乎偶然发现了单元测试

If you want to test if your factorial works or not, I'd recommend a proper unit testing library such as doctest or pytest . 如果您想测试阶乘是否有效,我建议您使用适当的单元测试库,例如doctestpytest Both are very easy to use, and it's good to get into the habit of writing tests early on in your code. 两者都很容易使用,并且养成在代码中尽早编写测试的习惯是很好的。

Here's an example of doctest: 这是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()

All your function seems to do is print out the result so what the actual function is returning is None so assert factorial(1) == 1 is actually being evaluated as assert None == 1 , which fails. 您的所有函数似乎都在打印结果,因此实际函数返回的结果为None,因此assert factorial(1) == 1实际上被评估为assert None == 1 ,这将失败。 Return a value from the function and the assert will no longer fail. 从函数返回值,断言将不再失败。

The problem here is you are not returning a value for the assert function to check what is returned by factorial function. 这里的问题是您没有为assert函数返回值来检查阶乘函数返回的值。

This is what I did: Just to test I simply added a return statement to return the results. 这就是我所做的:仅为了测试,我只是添加了一个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: ")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM