В моей прошлой карьере я часто обнаружил, что некоторые люди не писали тестовый код, и причина, по которой они утверждали, не писали, заключалась в том, что они не могли легко написать тестовые примеры, охватывающие несколько различных модулей. Что ж, я считаю, что большинству из них либо не хватает более простых в мастерских технических средствах, либо у меня нет времени, чтобы выяснить это. В конце концов, всегда будут различные давления, такие как прогресс на работе. Поскольку я не знаю, как тестировать, я часто игнорирую тестирование интеграции, и возникающие проблемы - это более худшее программное обеспечение, все больше и больше ошибок и более разочарованных клиентов. Поэтому я хочу поделиться некоторым личным опытом, чтобы раскрыть тайну интеграционного тестирования.
Как лучше интегрировать тестирование весенних проектов <br /> Использование инструментов: Spring, Junit, Mockito
Представьте, что существует такой весенний проект, который интегрирует некоторые внешние услуги, такие как некоторые банковские веб -сервисы. Затем проблемы, возникающие при написании тестовых примеров для этого проекта и завершения этих тестов в системе непрерывной интеграции, в основном одинаковы:
1. В каждом тесте будут транзакции, и каждая транзакция требует денежной стоимости, которая в конечном итоге будет нести клиент;
2. Чрезмерные запросы, выпущенные во время тестирования, могут рассматриваться как вредоносные запросы, которые могут привести к заблокированию счета в банке, что является последствием сбоя теста;
3. Когда тестирование выполняется с использованием непроизводственной среды, результаты испытаний не очень надежны. Точно так же последствием является то, что тест не удается.
Обычно, когда вы тестируете один класс, проблему легко решить, потому что вы можете виртуализировать некоторые внешние службы для вызова. Но при тестировании всего огромного бизнес -процесса это означает, что вам нужно проверить несколько компонентов, и в настоящее время вам необходимо включить эти компоненты в пружинный контейнер для управления. К счастью, Spring включает в себя очень превосходную структуру тестирования, которая позволяет вам вводить бобы из файлов конфигурации производственной среды в тестовую среду, но для тех, кто называется внешним сервисом, нам нужно сами написать фиктивные реализации. Первой реакцией обычных людей может быть повторное (изменение) бобов, вводимых пружиной на этапе установки теста, но этот метод необходимо тщательно продумано.
Предупреждение: Таким образом, ваш тестовый код нарушает собственное поведение контейнера, поэтому нет никакой гарантии, что он будет таким же, как результаты вашего теста в реальной среде.
Фактически, вместо того, чтобы внедрить макет сначала, а затем вносить его в требуемый фасоль, мы можем позволить Spring помочь нам внедрить макет класс с самого начала. Давайте продемонстрируем это с кодом.
Образец проекта содержит класс под названием BankService, представляющий вызов внешней службы, и класс под названием UserBalanceService, который вызывает BankService. UserBalanceService реализован очень просто, просто чтобы завершить преобразование баланса от строки в двойной тип.
Исходный код bankservice.java:
Public Interface Bankservice {String getBalanceByemail (строка Email);} Исходный код bankserviceimpl.java:
открытый класс BankServiceImpl реализует BankService {@Override public String getBalanceByemail (string email) {Выбросить новый UnsupPortedOperationException («Операция не удалась из -за внешнего исключения»); }} Исходный код userbalancesservice.java:
Интерфейс userbalanceService {double getAccountBalance (string email);} Исходный код userbalanceServiceimpl.java:
Общедоступный класс UserBalanceServiceImpl реализует userBalanceService {@Autowired Private BankService Bankservice; @Override public double getAccountBalance (string email) {return double.valueof (bankservice.getbalancebyemail (email)); }} Затем есть файл конфигурации XML Spring, добавляя необходимое объявление бобов.
Исходный код ApplicationContext.xml:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id = "bankservice"/> <bean id = "uerbalanceservice"/> beans = beanservice "/> <bean id =" </> </> </> </> beanservice "/> </> </> </> </> </> </> </> </> </> </> </> </> bean Id =" Bankservice "/> <Bean ID ="
Вот исходный код тестового класса UserBalanceServiceImpltest.java:
@Runwith (springjunit4classrunner.class) @contextconfiguration (locations = "classpath: /springtest/springockito/applicationcontext.xml") public class userbalanceServiceimplprofiletest {@autowwowired userbalanceService userBalanceServiceService; @Autowired Private Bankservice Bankservice; @Test public void wuder returnmockedbalance () {double balance = userbalanceService.getAccountBalance ("[email protected]"); Assertequals (Balance, Double.valueof (123,45d)); }} Как мы и ожидали, метод испытаний сообщает об исключении UnsupportedOperationException. Наша текущая цель состоит в том, чтобы заменить BankService на нашу реализацию моделирования. Можно использовать Mockito непосредственно для создания фабричных бобов, но есть лучший вариант, используйте структуру Springockito. У вас может быть грубая идея, прежде чем продолжить.
Оставшийся вопрос прост: как внедрить пружину в моделируемый боб вместо реального боба, не было никакого другого пути до весны 3.1, за исключением создания нового файла конфигурации XML. Но так как Spring представила определение профиля бобов, у нас есть более элегантное решение, хотя для этого подхода также требуется дополнительный файл конфигурации XML, специально для тестирования. Вот код для файла конфигурации testapplicationcontext.xml используется для тестирования:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:mockito="http://www.mockito.org/spring/mockito" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.mockito.org/spring/mockito https://bitbucket.org/kubek2k/springockito/raw/tip/springockito/src/main/resources/spring/mockito.xsd "> <import resource = "classpath: /springtest/springockito/applicationcontext.xml"/> <beans profile = "springtest"> <mockito: mock id = "bankservice"/> </beans> </beans>
Исходный код тестового класса UserBalancessErcieImplProfileTest.java после внесения соответствующих модификаций:
@Runwith (springjunit4classrunner.class) @contextconfiguration (locations = "classpath: /springtest/springockito/testapplicationcontext.xml")@ActiveProfiles (Profiles = {"Springtest"}) publicanceServiceServiceImplesPlileStest {@Autowired PrivateBaleServiceServiceServiceServiceServiceServiceServiceServiceServiceServiceImplesPlileTesteS @Autowired Private Bankservice Bankservice; @Before public void setup () throws exection {mockito.when (bankservice.getbalancebyemail ("[email protected]")). Then Return (String.valueof (123.45d)); } @Test public void wuder returnmockedbalance () {double balance = userbalanceService.getAccountBalance ("[email protected]"); Assertequals (Balance, Double.valueof (123,45d)); }} Возможно, вы заметили, что в методе настройки мы определяем моделируемое поведение и добавляем аннотацию @profile в класс. Эта аннотация активирует профиль под названием Springtest, поэтому бобы, смоделированные с использованием Springockito, можно автоматически вводить везде везде. Результат выполнения этого теста будет успешным, потому что Spring Inject Версия, смоделированная Springockito, а не версия, объявленная в ApplicationContext.xml.
Продолжайте оптимизировать наши тесты
Если мы сможем дополнительно принять решение этой проблемы, эта статья не будет казаться ошибочной. Springockito предлагает другое название под названием
Структура аннотации Springockito , которая позволяет нам использовать аннотации в тестовых классах для инъекционных классов. Прежде чем продолжить чтение, лучше пойти на сайт, чтобы посмотреть. Хорошо, вот модифицированный тестовый код.
Исходный код пользователя balanceServiceImplannotationtest.java: @runwith (springjunit4classrunner.class) @contextConfiguration (Loader = SpringOckitOcontextLoader.class = "classPath: /springtest/springockito/applicationcontextectreed UserbalanceService userBalanceService; @Autowired @replacewithmock private bankservice bankservice; @Before public void setup () throws exection {mockito.when (bankservice.getbalancebyemail ("[email protected]")). Then Return (String.valueof (valueof (123.45d))); } @Test public void wuder returnmockedbalance () {double balance = userbalanceService.getAccountBalance ("[email protected]"); assertequals (баланс, стоимость (123,45d)); }} Обратите внимание, что здесь нет вновь введенного файла конфигурации XML, но приложение для приложения Context.xml формальной среды используется непосредственно. Мы используем аннотацию @ReplacewithMock, чтобы отметить боб типа банкинга, а затем определяем поведение макетного класса в методе настройки.
PostScript
Проект Springockito-annotations имеет огромное преимущество, то есть он создает наш тестовый код по покрытию зависимостей, поэтому нам не нужно определять дополнительные файлы конфигурации XML или изменять файлы конфигурации производственной среды для тестирования. Если Springockito-annotation не используется, у нас нет выбора, кроме как определить дополнительные файлы конфигурации XML. Поэтому я настоятельно рекомендую вам использовать SpringockitaNationations в ваших интеграционных тестах, чтобы вы могли минимизировать влияние ваших тестовых случаев на свой производственный код, а также удалить бремя поддержания дополнительных файлов конфигурации XML.
PostScript
Написание интеграционных тестов для весенних проектов действительно намного проще. Код в статье относится к моему собственному GitHub.
Ссылка на перевод: http://www.codeceo.com/article/spring-test-is-isy.html
Оригинальный английский: проверить меня, если сможете #1 (Spring Framework)
Переводчик: песочница Ван, кодирующая сеть
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.