Недавно я экспериментировал с TDD при разработке приложения с графическим интерфейсом на Python. Я нахожу очень обнадеживающим иметь тесты, которые проверяют функциональность моего кода, но было сложно следовать некоторым рекомендованным методам TDD. А именно, сначала было сложно писать тесты. И я затрудняюсь сделать свои тесты читабельными (из-за широкого использования насмешливой библиотеки).
Я выбрал библиотеку-насмешку под названием mocker . Я часто его использую, поскольку большая часть кода, который я тестирую, вызывает (а) другие методы в моем приложении, которые зависят от состояния системы или (б) объекты ObjC / Cocoa, которые не могут существовать без цикла событий и т. Д.
Во всяком случае, у меня есть много тестов, которые выглядят так:
def test_current_window_controller():
def test(config):
ac = AppController()
m = Mocker()
ac.iter_window_controllers = iwc = m.replace(ac.iter_window_controllers)
expect(iwc()).result(iter(config))
with m:
result = ac.current_window_controller()
assert result == (config[0] if config else None)
yield test, []
yield test, [0]
yield test, [1, 0]
Обратите внимание, что на самом деле это три теста; все используют одну и ту же параметризованную функцию тестирования. Вот код, который тестируется:
def current_window_controller(self):
try:
# iter_window_controllers() iterates in z-order starting
# with the controller of the top-most window
# assumption: the top-most window is the "current" one
wc = self.iter_window_controllers().next()
except StopIteration:
return None
return wc
Одна из вещей, которые я заметил при использовании mocker, заключается в том, что сначала проще написать код приложения, а затем вернуться назад и написать тесты, так как большую часть времени я высмеиваю многие вызовы методов и синтаксис для написать поддельные вызовы гораздо более многословно (поэтому сложнее написать), чем код приложения. Проще написать код приложения, а затем смоделировать тестовый код.
Я считаю, что с помощью этого метода тестирования (и немного дисциплины) я могу легко написать код со 100% охватом тестирования.
Мне интересно, являются ли эти тесты хорошими тестами? Буду ли я сожалеть о том, что сделал это так в будущем, когда, наконец, обнаружу секрет написания хороших тестов?
Я так сильно нарушаю основные принципы TDD, что мои тесты напрасны?