Относительно «настоящих» бесконечных циклов, которые никогда не завершаются: процессы во встроенных системах иногда реализуются подобным образом и завершаются только тогда, когда система выключается из-за отключения питания или из-за гибели операционной системы.Для таких циклов типичное решение состоит в том, чтобы извлечь тело цикла в отдельную функцию / метод.
def main_loop():
while True:
main_body()
Таким образом, вы максимизировали количество кода, который можно протестировать модулем, извлекая его в main_body
.Ясно, что main_loop
все еще не может быть проверен модулем, но он может быть проверен в тестах более высокого уровня.
Очевидно, что ваш цикл не такой, так как у вас есть возможность выйти из цикла без убийстватемы или тому подобное.Поэтому я бы сказал, что ваш подход к тестированию этой функции в принципе вполне обоснован.
Однако есть несколько способов улучшить набор тестов.Для примера: тестовый пример, который вы показали в качестве примера, уже является сложным тестом, и я бы рекомендовал начать с более фундаментальных тестов:
- Проверка того, что число 1 принято
- Проверка того, что число 4 принято
- Проверка того, что число 0 не принято (последовательность: 0, 1 из 1..4)
- Проверка того, что число 5 не принято(последовательность: 5, один из 1..4)
Если какой-либо из этих тестов не пройден, это даст вам более четкое указание на причину проблемы.Эти тесты еще не проверяют (в отличие от вашего теста), сможет ли подпрограмма обрабатывать более одного неверного ввода и соответствуют ли запросы и сообщения об ошибках ожидаемым.Это, однако, отдельные аспекты, и поэтому имеет смысл разделить ваш тест на отдельные тесты, один тест на аспект.