Если вы хотите быть очень удобным для тестирования против API и интегрировать его в CI, чтобы проверить каждый коммит, то IT, включенный в Spring Boot, безусловно, лучший выбор.
Запишите тестовый пример быстро
@Runwith (springrunner.class) @springboottest (webenvironment = springboottest.webenvironment.random_port) @activeprofiles ({Profiles.env_it}) открытый класс DemointegrationTest {@autowworired private fooservice fooservice; @Test public void test () {System.out.println ("tested"); }}Среди них Springboottest определяет некоторые конфигурации при их запусках. Приведенный выше код использует случайные порты, и, конечно, он также может предопределять порты, как это
@Springboottest (webenvironment = springboottest.webenvironment.defined_port, Properties = {"server.port = 9990"})ActiveProfiles заставляет использовать его профиль. Из наилучшей практики адреса баз данных или других компонентов ресурсов, настроенных по ИТ -профилю, должны быть изолированы из среды разработки или постановки. Потому что, когда он проходит через многие ситуации, нам нужно очистить тестовые данные.
Вы можете обнаружить, что такой случай может быть введен с автоматическим автообожением в любой желаемый сервис. Это связано с тем, что пружина загружает весь контекст, который такой же, как и фактическая работающая среда, включая базу данных, кэш и другие компоненты. Если вы чувствуете, что вам не нужны все ресурсы во время тестирования, то вы можете удалить соответствующую конфигурацию в профиле. Это полная эксплуатационная среда, единственная отличие состоит в том, что она автоматически выключается после завершения использования.
Проверьте API REST
Настоятельно рекомендую библиотеку добавить в Gradle
TestCompile 'io.Rest-Assured: Rest-Offered: 3.0.3'
Поддержите JsonPath, что очень полезно. Нажмите здесь для конкретных документов
@Sql (scripts = "/testdata/users.sql")@testpublic void test001login () {string username =" [email protected] "; String password = "demo"; JwtauthenticationRequest request = new jwtauthenticationRequest (имя пользователя, пароль); Ответ ответа = dest (). ContentType (contentType.json) .body (request). assertthat (response.path ("token"), is (isnull.notnullvalue ())); AssertThat (response.path ("Expiration"), is (isnull.notnullvalue ()));} @SQL используется для выполнения данных тестирования вставки SQL перед тестированием. Обратите внимание, что given().body() передается в Java Object jwtauthenticationRequest, потому что поверенный REST автоматически поможет вам использовать Джексона для сериализации объекта в строку JSON. Конечно, вы также можете поместить переоборудованный JSON в тело, эффект такой же.
Результат возврата попадает в ответ, а затем данные можно получить с использованием JSONPath для проверки. Конечно, есть еще один более интуитивно понятный способ, который может получить полный ответ через ответ.
На данный момент самый основной он завершен. Добавление тестирования Step Gradle в Jenkins может достичь тестирования каждый раз, когда отправляется код.
Некоторые сложные ситуации
Смешанные данные
Это лучше всего случиться. Проект имеет много разработчиков, и каждый разработчик напишет свой собственный ИТ -случай, так что, если есть влияние между данными. Это легко понять. Например, в сценарии, в котором записывается тестовая партия, метод окончательной проверки состоит в том, чтобы увидеть, составляет ли объем написанных данных 10 000 строк. Затем другой разработчик написал другие случаи, и случайно добавил новые данные в эту таблицу, которые превратились в строки 10 Вт+1, поэтому дело, написанное партиями, не сможет убежать.
Чтобы предотвратить эту ситуацию, мы используем каждый тестовый класс для очистки данных. Поскольку это операция на основе класса, вы можете написать базовый класс для его решения.
@Runwith (springrunner.class) @springboottest (webenvironment = springboottest.webenvironment.random_port) @activeprofiles ({Profiles.env_it}) Общественный класс BaseInteGrationTest {Private jdbctemplate jdbctemplate; @Autowired public void setDataSource (DataSource DataSource) {jdbctemplate = new jdbctemplate (dataSource); } @Value ("$ {local.server.port}") защищенный int port; @Before public void setupenv () {restAsred.port = port; RestAsed.basepath = "/api"; RestAsred.baseuri = "http: // localhost"; RestAsred.config = restAssud.config (). Httpclient (httpclientconfig.httpclientconfig (). Httpmultipartmode (httpmultipartmode.browser_compatible)); } public void tepdowNENV () {dest (). contentType (contentType.json) .hen (). post ("/auth/logout"); } @Afterclass public static void cleandb () Throws SQLexception {resource resource = new ClassPathresource ("/testData/cleandb.sql"); Connection Connection = jdbctemplate.getDataSource (). GetConnection (); Scriptutils.executesqlscript (connection, resource); connection.close (); }}@AfterClass использует JDBCTemplate для выполнения CleanDB.SQL, который очищает все тестовые данные таким образом.
@ Value("${local.server.port}") также необходимо упомянуть, поскольку порт случайный, оставленный не знает, на какой порт отправляется запрос. Здесь используйте @Value, чтобы получить текущий номер порта и установить его на RestAssured.port, чтобы решить эту проблему.
Как обрабатывать общие данные
Запуск полного, может потребоваться десятки классов и сотни методов. Так что, если некоторые данные требуются для всех случаев и должны быть очищены только после того, как будут выполнены все случаи? Другими словами, этот вид очистки данных основана не на классе, а на сразу. Например, начальные пользовательские данные, городская библиотека и т. Д.
Мы сыграли умный трюк и использовали пролечение
@Configuration@condityalonclass ({dataSource.class}) открытый класс UpgreautoConfiguration {public Static Final String Flayway = "Flyway"; @Bean (name = flayway) @profile ({env_it}) public urgradeservice cleanAndupgradeService (dataSource DataSource) {MupgrageService MuprageService = new FlayupGradeService (dataSource); try {urdradeservice.cleanAndupgrade (); } catch (Exception ex) {logger.error ("Flayway не удалось!", Ex); } return upgradeService; }} Вы можете видеть, что когда профиль будет, Flyway отпустит все таблицы и выполнит сценарий обновления по очереди, создавая тем самым полную таблицу данных, которая, конечно же, пуста. В пути тестирования проекта добавьте огромную версию SQL, чтобы в конце можно было вставить общие данные тестирования, такие как src/test/resources/db/migration/V999.0.1__Insert_Users.sql , идеально решают различные проблемы с данными.
краткое содержание
Использование встроенной службы тестирования в Spring Boot может быстро проверить API. Мне не нужно начинать сервис, а затем нажимать на страницу руководства, чтобы проверить мой API. Я напрямую общаюсь со своими коллегами-интерфейсом в формате запроса и пишу случай, чтобы проверить его.
Конечно, существует также недостаток этого метода, который заключается в том, что стресс -тестирование системы неудобно. Ранее тестовые примеры API компании были написаны Jmeter, что было бы гораздо удобнее при выполнении тестов производительности.