За последние несколько недель я размышлял и изучал, как заполнить пробел в нашей методологии тестирования. Упрощенно, юнит-тесты слишком малы, а традиционные интеграционные тесты слишком велики.
Частым сценарий придумывает , где A
и B
как использовать компонент C
. Однако A
и B
имеют несколько иные требования, и делают несколько иные предположения C
. Если я разработчик того, A
как и где я проверяю свои предположения C
?
Очевидно, что модульное тестирование A
с использованием поддельных предположений C
подходит для тестирования A
в изоляции, но оно не проверяет сами предположения.
Другая возможность - добавить юнит-тесты для C
. Однако это не идеально, потому что, пока он A
находится в стадии разработки, изменение тестов на C
развивающиеся предположения A
будет чрезмерно неуклюжим. Действительно, A
разработчик может даже не иметь адекватного доступа к модульным тестам C
(например, внешней библиотеке).
Чтобы сформулировать это на более конкретном примере: предположим, что это приложение узла. A
и B
зависит от того, C
чтобы прочитать файл (среди прочего) и сохранить содержимое файла в объекте, переданном в C
. Сначала все файлы, которые C
обрабатывают, являются маленькими и могут быть прочитаны синхронно без существенной блокировки. Однако разработчик B
понимает, что его файлы становятся огромными и ему нужно переключиться C
на асинхронное чтение. Это приводит к спорадической ошибке синхронизации A
, которая по-прежнему предполагает C
синхронное чтение файлов.
Это тип ошибки, который общеизвестно трудно отследить от полных интеграционных тестов, и может вообще не быть обнаружен в интеграционных тестах. Он также не учитывается A
модульными тестами A
s, потому что предположения s являются ложными. Однако это может быть легко поймано "мини" интеграционным тестом, который выполняет только A
и C
.
Я нашел только несколько ссылок на этот тип тестирования. Интеграция в малых , тестирование интеграции компонентов , единицы интеграции тестирования. Это также в некоторой степени относится к направлению тестирования BDD, а не к формальному тестированию модулей TDD.
Как мне заполнить этот пробел? Конкретно - куда мне ставить такие тесты? Как смоделировать входы A
и C
для «мини» интеграционных тестов? И сколько усилий нужно приложить для разделения проблем тестирования между этими тестами и юнит-тестами? Или есть лучший способ заполнить пробел тестирования?