簡體   English   中英

在這種情況下如何使用Assert?

[英]How to use Assert in this instance?

我正在嘗試使用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段是否正確?

您的階乘函數可打印結果,但不會返回結果。 這就是斷言失敗的原因。 嘗試這個:

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

您的所有函數似乎都在打印結果,因此實際函數返回的結果為None,因此assert factorial(1) == 1實際上被評估為assert None == 1 ,這將失敗。 從函數返回值,斷言將不再失敗。

這里的問題是您沒有為assert函數返回值來檢查階乘函數返回的值。

這就是我所做的:僅為了測試,我只是添加了一個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