#python #unit-testing #testing #mocking
#python #модульное тестирование #тестирование #издевательство
Вопрос:
Есть очень простая вещь для тестирования в файле с именем gui.py:
def getInputs():
a = int(input("Enter Liters : "))
b = int(input("Enter Persons: "))
Типичные вещи, такие как положительные числа, отсутствие символов и т.д.
Теперь есть тестовые примеры, которые выполняются, например:
import gui # The code to test
import unittest # The test framework
from unittest.mock import patch
class Test_guiInputs1(unittest.TestCase):
@patch('builtins.input')
def test_getInputs1(self, mock_input):
mock_input.side_effect = [20, 2]
tuple = (20, 2)
self.assertEqual(gui.getInputs(), tuple)
class Test_guiInputs2(unittest.TestCase):
@patch('builtins.input')
def test_getInputs(self, mock_input):
mock_input.side_effect = [-20, 2]
tuple = (-20, 2)
self.assertEqual(gui.getInputs(), tuple)
Теперь есть 2 класса с 1 методом, так как мне не удалось ввести второй метод в первом классе. Интересно, нужна ли макетной функции некоторая повторная инициализация или что-то еще.
Все подходы подобны этому…
class Test_guiInputs3(unittest.TestCase):
@patch('builtins.input')
def test_getInputs1(self, mock_input):
mock_input.side_effect = [-20, 2]
tuple = (-20, 2)
self.assertEqual(gui.getsome(), tuple)
def test_getInputs2(self, mock_input2):
mock_input2.side_effect = [-20, 2]
tuple2 = (-20, 2)
self.assertEqual(gui.getsome(), tuple2)
… приводит к неудачному результату теста при 2-м методе. Первый получает зеленый флаг в VSC (как и ожидалось). Второй — даже с теми же значениями из первого тестового примера.
Кто-нибудь знает, что происходит не так?
(Python 3.7.1, VSC, Windows 10 Pro в случае, если это важно для каких-либо известных ошибок, специфичных для конкретной версии.)
Комментарии:
1. Основываясь на методах тестирования, я предполагаю
getInputs
, что они действительно возвращаются(a, b)
?
Ответ №1:
Синтаксис декоратора применяется только к следующему определению.
@foo
def bar():
...
эквивалентно
def bar():
...
bar = foo(bar)
Вы украшаете только первый метод, независимо от того, сколько пробелов находится между декоратором и функцией. Вам нужно украсить оба метода.
class Test_guiInputs3(unittest.TestCase):
@patch('builtins.input')
def test_getInputs1(self, mock_input):
mock_input.side_effect = [-20, 2]
tuple = (-20, 2)
self.assertEqual(gui.getsome(), tuple)
@patch('builtins.input')
def test_getInputs2(self, mock_input2):
mock_input2.side_effect = [-20, 2]
tuple2 = (-20, 2)
self.assertEqual(gui.getsome(), tuple2)