На прошлой неделе я обнаружил, что мне нужно подумать о том, как реорганизовать старое приложение, которое содержит только модульные тесты. Моя первая идея заключалась в том, чтобы добавить некоторые тестовые сценарии компонентов с Cucumber, чтобы ознакомиться с бизнес-логикой и убедиться, что я ничего не нарушаю с изменениями. Но в тот момент у меня был разговор с одним из архитекторов в компании, в которой я работаю, и заставило меня задаться вопросом, стоит ли это, и каков был фактически код, который я должен был проверить.Тесты на регрессионные компоненты с огурцом. Есть ли какая-либо граница для слоев, которые необходимо протестировать?
Это приложение имеет множество различных типов конечных точек: конечные точки отдыха, которые должны быть вызваны и вызывать, хранимые процедуры Oracle и темы и очереди JMS. Он развертывается в военном файле на сервере Tomcat, а фабрика подключений к брокеру и источник данных в базе данных настраиваются на сервере и извлекаются с использованием JNDI.
Моя первая идея состояла в том, чтобы загрузить все приложение внутри встроенного Jetty, указывая на настоящий web.xml, чтобы все было загружено, поскольку оно будет загружено из рабочей среды, а затем издевается над фабрикой соединений и источником данных. Таким образом, вся логика подключения к инфраструктуре, в которой развертывается приложение, будет протестирована. Думая о гексагональной архитектуре, это кажется слишком большим усилием, имея в виду, что это только порты, логика которых должна состоять только в преобразовании полученных данных в данные приложения. Разве это не нужно тестировать?
Моя следующая идея состояла в том, чтобы просто издеваться над хранимыми процедурами и загружать Spring XML в мой тест без какого-либо веб-сервера, что облегчает издевательство классов. Для этого я бы использовал библиотеки Spring MockMvc для остальных конечных точек и Mockrunner для JMS. Но опять же, этот подход все равно будет проверять некоторые адаптеры и усложнять тест, поскольку результатом тестов будут XML и JSON. Преобразования, выполненные в этом приложении, довольно тяжелые, когда один и тот же тип сообщения может содержать разные версии класса (каждое сообщение может содержать много сложного объекта, реализующего несколько интерфейсов).
Так что сейчас я думал, что, возможно, лучший подход состоял бы в том, чтобы просто создать мои тесты из точки входа в приложение, службы, вызванные из адаптеров, и убедиться, что службы, ответственные за отправку сообщений брокером или для вызова других конечных точек REST на самом деле вызывается. Затем просто убедитесь, что для конечных точек есть соответствующие модульные тесты, и убедитесь, что все работает после развертывания, просто предоставив некоторые тесты дыма, которые выполняются в реальной среде. Это проверит логику подключения, и бизнес-логика будет протестирована изолированно, не заботясь о добавлении нового адаптера или удалении одного из них.
Правильно ли этот подход? Могу ли я оставить что-то, не проверив этого? Или это все еще слишком много, и я должен просто доверять модульным тестам?
Спасибо.
Насколько я понимаю, этот подход был бы противоположным тому, что мне сказали быть честным. Я понимаю идею написания первых примеров использования с использованием подхода BDD, и именно это я и хотел сделать. Но не добавит ли набор приемочных тестов, работающий в реальной среде, дольше, чтобы протестировать приложение? Я понимаю, что вы хотите иметь набор тестов, который проверяет вашу бизнес-логику, не полагаясь на какую-либо внешнюю систему (включая BBDD), чтобы ускорить работу. Имея надлежащие тесты компонентов, которые проверяют вашу логику, вы оставите тест в реальной среде, чтобы проверить проводку. – Kilian
Вот почему я предложил просто добавить к текущему модулю тесты набора тестов, написанных с использованием стиля BDD, который будет проверять все различные варианты использования доступный, но только из служб приложений. В модульных тестах необходимо протестировать любое преобразование, сделанное от порта к приложению, поэтому любой новый добавленный порт будет тестироваться отдельно, не нужно обновлять какой-либо тестовый пример, если это произошло. Пробный запуск дыма после развертывания должен проверять проводку, что внешние службы работают как ожидалось и что порты достижимы. Есть что-то неправильно или пропущено, используя этот подход? – Kilian
Что касается работы в реальной среде (я предполагаю, что вы имеете в виду тестовую среду, а не производство), я бы не ожидал, что приемочные тесты займут слишком много времени, хотя я также не ожидал, что они будут такими же быстрыми, как модульные тесты. Я уточню, что должно быть только столько, сколько необходимо. Я сказал, что вы должны изолировать их от внешних зависимостей. Что касается их цели, тестирование проводки (интеграционное тестирование) - это точно. Что касается целей приемочных испытаний и тестов на дым, гораздо лучше найти ошибки интеграции в тестировании, чем в производстве. –