Есть ли что-то, чего мне здесь не хватает?
Пара вещей.
Во-первых, вам не обязательно все ваши тесты, чтобы указывать точныйповедение субъекта. Утверждение о том, что два представления точно равны друг другу, является хорошей отправной точкой в смысле simplest thing that could possibly work
, но это не единственный выбор, который у вас есть. Может быть столь же эффективно иметь набор тестов, каждый из которых устанавливает какое-то ограничение - тогда, когда вы вносите небольшое изменение в свое предполагаемое поведение, вам нужно всего лишь внести небольшое изменение среди тестов.
Еще один дизайн модулей;см. [Parnas 1971]. Основная идея здесь заключается в том, что каждый модуль моделируется на основе решения, и если мы меняем решение, мы заменяем этот модуль. Границы модулей действуют как переборки для изменений.
В вашем примере, вероятно, есть по крайней мере два модуля
path = "C:/my_project/dir_1/message01"
expected = "dir_1_log_01.txt"
Это выглядит так, будто вам понадобится функция parse
для извлечения интересной информации из пути и некоторой функции apply to template
для выполнения чего-то интересного с извлеченной информацией.
Это может позволить вам написать утверждение типа
assertEquals(
applyTemplate("dir_1", "01"),
convertPathToLogFileName(path)
)
, а затем в другом местеу вас может быть что-то вроде
assertEquals(
"dir_1_log_01.txt",
applyTemplate("dir_1", "01")
)
Когда вы позже решите, что ваше написание должно измениться, вам нужно всего лишь изменить второе утверждение. См. Джеймс Шор, Тестирование без насмешек , для получения дополнительной информации об этой идее.
Что будет часто происходить в мире, управляемом тестами, так это то, что, обнаружив, что нам нужно изменить какое-то поведение, мы будемрефакторинг, чтобы создать модуль, основанный на решении, которое мы собираемся изменить, и ввести путь, по которому мы можем настроить, какой модуль участвует в нашей системе - все эти изменения могут быть сделаны без нарушения каких-либо существующих тестов. Затем мы начинаем вводить новые тесты, в которых описывается модуль замены и как он взаимодействует с остальной частью вашего решения.
Если вы посмотрите выше, вы увидите, что я вроде бы подразумевал это, введя applyTemplate
гдеу вас было только convertPathToLogFileName
- я реорганизовал convertPath для создания функции applyTemplate, и теперь я могу изменить поведение системы локально.
Это не спасет нас, когда у нас большое количествоиз переоборудованных тестов;мы не прикованы наручниками к конкретной реализации теста навсегда. Вместо этого мы смотрим на тесты, которые затрудняют изменение реализации, и рассматриваем, как мы могли бы изменить дизайн тестов, чтобы облегчить будущие изменения.
Тем не менее, ожидается определенная доработка -лучшее доказательство того, какой код нам нужно изменить в будущем, - какой код нам нужно изменить сейчас . Функции, которые не меняются, будут хорошо работать с переобученными тестами. Мы хотим вкладывать деньги на дизайн в те части кода, которые мы регулярно модифицируем.