Python unittest, когда использование ввода находится внутри цикла

1

У меня есть следующее:

def func():
    s = 1
    i = -1
    while i != 0:
        s += i
        i = int(input())
    return s

if __name__ == "__main__":
    result = func()
    print(str(result))

Вы увидите, что есть один вызов функции, но функция содержит цикл, который выполняет итерацию до тех пор, пока использование не введет значение 0.

Как проверить эту функцию с помощью библиотеки unittest?

Теги:
unit-testing
python-unittest

1 ответ

2
Лучший ответ

Я предполагаю, что ваш код находится внутри модуля mymodule.py. Поэтому вы можете создать тестовое имя файла test_mymodule.py для реализации ваших тестов. Вы хотите использовать модуль unittest.mock для доступа к функции patch(), чтобы украсить встроенный вход.

Что это значит, так это то, что вместо того, чтобы вызывать функцию ввода для запроса пользователя, вы исправляете его, чтобы возвращать значения, определенные в side_effect. Поэтому каждый вызов ввода возвращает значение списка. Обратите внимание, что вы также должны включить 0, иначе тест не будет работать.

Для каждой последовательности входов вам придется вычислять вручную (или даже использовать вашу программу), чтобы предоставить конечный результат для метода assertEqual.

import unittest                                                                                                                                                                               
import unittest.mock                                                                                                                                                                          

from mymodule import func                                                                                                                                                                     

class TestModule(unittest.TestCase):                                                                                                                                                          

    @unittest.mock.patch('builtins.input', side_effect=[1, 2, 3, 0])                                                                                                                          
    def test_func_list1(self, mock):                                                                                                                                                          
        self.assertEqual(func(), 6)                                                                                                                                                           

    @unittest.mock.patch('builtins.input', side_effect=[0])                                                                                                                                   
    def test_func_list2(self, mock):                                                                                                                                                          
        self.assertEqual(func(), 0) 

Каждому методу тестирования должен быть префикс с test_. Шаблон по умолчанию при использовании python -m unittest из CLI ищет test*.py в текущем каталоге (это то же самое, что и выполнение TestLoader.discover(). Возможно, вы можете изменить это, если хотите, но вам придется ознакомьтесь с документацией unittest для получения более подробной информации.

  • 0
    Это сработало. Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню