Как использовать Assert в этом случае? - PullRequest
1 голос
/ 28 ноября 2011

Я пытаюсь использовать 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 ]

3 голосов
/ 28 ноября 2011

Ваша факторная функция печатает результат, но не возвращает его. Вот почему утверждение неверно. Попробуйте это:

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()
1 голос
/ 28 ноября 2011

Проблема здесь в том, что вы не возвращаете значение для функции 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: ")
1 голос
/ 28 ноября 2011

Похоже, все, что делает ваша функция, это распечатывает результат, поэтому реальная функция возвращает None, поэтому assert factorial(1) == 1 фактически оценивается как assert None == 1, что не удается.Верните значение из функции, и утверждение больше не будет ошибочным.

...