Python unittest, когда использование ввода находится внутри цикла - PullRequest
0 голосов
/ 12 октября 2018

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

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?

1 Ответ

0 голосов
/ 12 октября 2018

Я предполагаю, что ваш код находится внутри модуля с именем 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 из интерфейса командной строки ищет test*.py в текущем каталоге (он аналогичен запуску TestLoader.discover () . Вы можете изменить это, если хотите, но выдля получения более подробной информации ознакомьтесь с документацией unittest .

...