python doctest: ожидаемый результат совпадает с результатом «получено», но тест не удался

#python #doctest

#python #doctest

Вопрос:

Я нахожусь на стадии обучения использованию Python в качестве инструмента для контроля качества программного обеспечения.

Я написал следующий простой тест, чтобы найти букву «a» в матрице номеров текстового файла. проблема в том, что тест завершается неудачей, хотя ожидаемое значение равно тому, что я получил.

Почему это? Можете ли вы сказать мне, что я делаю не так?

тестовый скрипт:

 fin = open("abc.txt", "r")

arr_fin = []

for line in fin:
    arr_fin.append(line.split())

print arr_fin

for row in arr_fin:     
   arr_fin_1 = " ".join('{0:4}'.format(i or " ") for i in row) 
   print arr_fin_1



def find_letter(x, arr_fin_1):
    """
    >>> find_letter('a', arr_fin_1)
    97 
    """
    t=ord(x) #exchange to letter's ASCII value
    for i in arr_fin_1:
        if i==x:
            print t
            return;

def _test():
    import doctest
    doctest.testmod()

if __name__ == "__main__":
    _test()
  

сообщение об ошибке:

 Expected:
    97 
Got:
    97
**********************************************************************
1 items had failures:
   1 of   1 in __main__.find_letter
***Test Failed*** 1 failures.
  

Комментарии:

1. 1 за вопрос: ошибку такого рода очень легко допустить :-/

Ответ №1:

У вас есть дополнительный пробел после 97 — если вы удалите его, ваш тест должен пройти нормально.

Ответ №2:

Это:

 return;
  

Возвращает вашу функцию None .

Вы имели в виду return t ?


Кроме того, ИМХО doctest тесты должны быть автономными. Это то, что пользователь должен увидеть в вашей документации и понять без контекста. В вашем примере вы используете модульно-локальный arr_fin_1 объект, который полностью непрозрачен для пользователя. Лучше определить его в doctest перед find_letter вызовом, чтобы предоставить автономный пример.

Комментарии:

1. На самом деле в этом случае либо «print t», либо «return t», похоже, завершают проверку, если вы удалите пробел, упомянутый @Frank Schmitt. Наличие как «print t», так и «return t» приводит к сбою doctest, поскольку он получает 97 дважды .

2. Но я согласен, что это странное использование doctests (насколько я понимаю, вы должны думать о doctests как о документации, которую вы можете проверить, а не как о контроле качества вашего программного обеспечения). Они должны быть полностью автономными и не зависеть от внешнего контекста.