У меня есть следующее:
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?
Я предполагаю, что ваш код находится внутри модуля 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 для получения более подробной информации.