Чтобы ни у кого не сложилось впечатление, что J.B. Rainsberg стоит в ярой оппозиции к интеграционым тестам глядя на эти фразы, я все же рекомендую просмотреть видео полностью и прочитать его блог. У кого нет времени на это (а его речь на видео занимает 1.5 часа.), то вкратце его логическая цепочка такова:
Интеграционные тесты долгие, а это значит долгое время реакции на ошибку, а поэтому народ сокращает и либо выполняет их частично либо вообще не выполняет, что приводит к ложному чувству уверенности что все хорошо. А чего они такие долгие - то? А потому что до выполнения первого assert-а необходимо подготовить кучу всего, а он приверженец того, что один тест должен содержать один assert, потому что количество упадших тестов будет отображать состояние системы, а если за одним assert-ом прячется другой, то поправив первый мы можем натолкуться на второй и т.д., вобщем неизвестно сколько работы предстоит и в каком все состоянии находиться. Но assert–ов хочется понатыкать побольше, т.к. велик объем подготовительной работы был сделан для них, поэтому выходит, что assert-ы у разных тестов перекрываются. Да и подготовительная работа дуплицируется. Для двух тестов она может перекрываться на 90%, но для всех перекрытие 0. Да и вообще сколько можно написать тестов? Ну 2000. А комбинаций путей кода которые надо проверить - миллоны. И как в лотерее, что покупая 10 билетов, что 10000 шансы все равно остаются почти никакие, так и в тестировании интеграционными тестами количеством сильно делу не поможешь. Потом он говорит такую (очень правильную на мой взгляд) мысль, что и нечего использовать интеграционные тесты для проверки именно корректности работы. Они для другого служат, они для кастомеров, а для именно проверки работы приложения служат другие тесты. (В этой части речи я подумал, ну вот сейчас дальше он будет говорить про изолированное тестирование с помощью моков, в общем ничего нового для руби программистов, к тому же обильное использование моков дает такое же чувство ложной уверенности от которого он пытался уйти, тесты проходят а система не работает). Ну и действительно, он стал рассказывать про моки, но продвинулся далее, и сказал что действительно мокая что либо, надо задаваться вопросом а имеем ли мы право это мокать, т.к. мы делаем предположения о методах и возвращаемых результатах, а так ли эти предположения обоснованы? Ну и действительно, эти предположения надо проверять, а поэтому наряду к этим тестам, которые он назвал "коллоборационными" надо писать дополнительные, которые он назвал "контрактными", которые проверяют действительно ли то, чего мокают ведет себя таким образом как ожидается. (При этом, кстати, он как то опускает вопрос подготовки этих самых систем для тестирования, хотя конечно очевидно, что работы на их подготовку в изоляции на прокачку "контрактов" потребуется меньше чем для интеграционных тестов). Ну и далее утвеждает, что хоть не может доказать, но изоляционные тесты плюс "коллоборационные" плюс "контрактные" достаточны на 100% для проверки корректности системы. Хотя правда неудобно то, что каждое использование мока требует комплиментарного "контрактного" теста, и это своего рода избыточность, вот если бы это можно было автоматизировать - то PHD на подобного рода работе можно спокойно сделать.
Интересно еще его блог почитать, там он показывает, как с помощью его метода, можно было бы поймать ситуацию когда марсоход не примарсился из за того, что его дернуло парашютом в момент раскрытия и система приземления сработала на это как на толчок о поверхность марса и отцепила парашют. Там интересно почитать ход его мысли выраженной в псевдокоде, но понятно, что пиши он "коллаборационные" тесты без "ability to notice things", то подобный печальный сценарий вполне можно было бы и пропустить. У меня сложилось ощущение, что интеграционным тестом он бы был "скорее" пойман, даже на этапе "happy path", когда все шло без эксцессов.
Вобщем, посмотрев его выступление - очевидно, что многие аргументы притянуты за уши, например такая цепочка как интеграционные тесты зло, т.к. их не пользуют, т.к. долго очень. Т.к. корень зла в том что _долго_, а не в том, что они интеграционные. Надо смотреть хотя бы какого уровня система, может она небольшая и там не растягиваются они на часы, а выполняются за минуты. Опять же надо смотреть, а что было сделано, чтобы улучшить время, правильный ли подход используется и т.п. Т.е. не все так однозначно.
Ну и прошу не записывать меня в абсолютные пропоненты интеграционного тестирования, я ранее употреблял слово "более высокоуровневые" чем юнит тесты, вобщем J.B. Rainsberg тоже говорит о более высокоуровневых. Просто вреда от неправильно сделанных локальных вещей меньше, чем если что либо не сходится на высоком уровне.