Пропустити навігацію EPAM

Testcontainers: інноваційний підхід до інтеграційного тестування

Лайфхаки
  • Java
  • Testing

У світі розробки програмного забезпечення інтеграційне тестування відіграє ключову роль у забезпеченні надійності та якості продукту. Ми часто стикаємося із задачею, як простіше організувати end-to-end тестування. Саме тут на допомогу приходять Testcontainers — інноваційний інструмент, що має значний вплив на спосіб проведення інтеграційних тестів у Java-проєктах.

Нещодавно відбувся вебінар, де спікером виступив Микола Махін, Lead Software Engineer в EPAM та автор YouTube-каналу «Просто про ІТ». Експерт поділився своїм досвідом взаємодії з Testcontainers та продемонстрував, як записувати відео роботи Selenium тестів, що своєю чергою допоможе вам краще розуміти поведінку вашої системи під час тестування та виявляти потенційні проблеми.

У цій статті ми розглянемо, що таке Testcontainers та які переваги вони надають розробникам. Ми також покажемо, як налаштувати середовище для інтеграційного тестування за допомогою цієї технології. Крім того, ми поділимося практичними порадами щодо написання та виконання тестів, використовуючи Testcontainers разом з інструментами на кшталт Selenium.

Про Testcontainers та їхні переваги

Testcontainers — це відкрита бібліотека для Java та деяких інших мов програмування, яка дає змогу розробникам легко створювати та керувати контейнерами Docker для тестування. Ця інноваційна технологія дозволяє визначати, запускати та керувати контейнерами Docker безпосередньо з тестового коду. Testcontainers спрощує інтеграційне тестування, надаючи легкий та ефективний спосіб створення одноразових контейнерів для різних сервісів та баз даних.

Використання Testcontainers має низку суттєвих переваг:

  1. Швидкість та ізоляція: Testcontainers забезпечує швидкі, ізольовані тестові середовища, які можна швидко створювати та видаляти. Це дає змогу розробникам частіше запускати тести, що призводить до швидшого отримання відгуків під час процесу розробки.
  2. Відтворюваність: завдяки використанню контейнеризованих середовищ, інтеграційні тести виконуються послідовно в різних середовищах розробки та тестування, забезпечуючи відтворювані результати.
  3. Зменшення накладних витрат: Testcontainers усуває потребу в підтримці окремих тестових середовищ, зменшуючи загальні накладні витрати на обслуговування для команди розробників.
  4. Реалістичне тестування: з Testcontainers ви можете запускати тести, використовуючи реальні залежності, замість мокування, що підвищує довіру до вашого набору тестів.

ПРИЄДНУЙСЯ ДО НАШОЇ КОМАНДИ

Порівняння з традиційними підходами

Порівняно з традиційними методами, Testcontainers має значні переваги:

  1. гнучкість: на відміну від використання вбудованих баз даних або «реальних» баз даних у контейнерах Docker, Testcontainers надає програмований API для створення необхідних залежних сервісів як контейнерів Docker.
  2. консистентність: тести на основі Testcontainers запускаються однаково як у CI-конвеєрі, так і локально, незалежно від того, чи ви вирішите запустити окремий тест через IDE, клас тестів або навіть весь набір з командного рядка.
  3. широка підтримка: Testcontainers підтримує широкий спектр контейнерів Docker, включаючи бази даних, брокери повідомлень, вебсервери тощо, що дозволяє створювати тестові середовища, адаптовані до конкретного стека додатків.

Завдяки цим перевагам, Testcontainers стає потужним інструментом для спрощення інтеграційного тестування в сучасній розробці програмного забезпечення.

Налаштування середовища для інтеграційного тестування

Налаштування середовища для інтеграційного тестування з використанням Testcontainers — це простий процес, який дає змогу створити надійне та ізольоване тестове середовище. Розглянемо основні кроки для налаштування такого середовища.

Створення Docker-контейнерів

Для створення Docker-контейнерів ми використовуємо API Testcontainers. Наприклад, щоб створити контейнер PostgreSQL, ми можемо використати наступний код:

PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15.2-alpine");

Цей рядок створює контейнер PostgreSQL версії 15.2 на основі Alpine Linux. Важливо зазначити, що ми вказуємо конкретну версію образу, а не використовуємо тег "latest", щоб забезпечити стабільність тестів.

Конфігурація мережі та портів

Testcontainers дозволяє зручно керувати маппінгом портів за допомогою withExposedPorts та setPortBindings. Замість використання фіксованих портів, ми отримуємо доступ до портів контейнера наступним чином:

String jdbcUrl = postgres.getJdbcUrl(); Integer mappedPort = postgres.getMappedPort(5432);

Це забезпечує портативність тестів та їх надійне виконання в різних середовищах, включаючи CI/CD пайплайни.

Управління життєвим циклом контейнерів

Для ефективного управління життєвим циклом контейнерів ми можемо використовувати анотації JUnit 5:

@Testcontainers class MyIntegrationTest {   @Container     static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15.2-alpine");     // Тести }

Анотація @Testcontainers автоматично запускає контейнери перед виконанням тестів та зупиняє їх після завершення. Це звільняє нас від необхідності явно керувати життєвим циклом контейнерів.

Використовуючи ці підходи, ми можемо створити надійне середовище для інтеграційного тестування з Testcontainers, в тому числі із використанням Selenium в докер-контейнері засобами Testcontainers. Це дає змогу проводити тести з реальними залежностями, забезпечуючи високу якість та надійність нашого програмного забезпечення.

Написання та виконання інтеграційних тестів

Інтеграційне тестування є важливим етапом у розробці програмного забезпечення, який дозволяє перевірити взаємодію між різними компонентами системи. З використанням Testcontainers цей процес стає значно простішим та ефективнішим.

Створення тестових сценаріїв

Для створення тестових сценаріїв з Testcontainers ми можемо використовувати звичайні інструменти для тестування, такі як JUnit. Ось приклад простого тестового класу:

@Testcontainers public class IntegrationTest {          @Container               public GenericContainer redis = new GenericContainer(DockerImageName.parse("redis:6-alpine"))                   .withExposedPorts(6379);       @Test     public void testSimpleScenario() {             String address = redis.getHost();                   Integer port = redis.getFirstMappedPort();                   // Тут ми можемо використовувати address та port для підключення до Redis                // та виконання наших тестів              } }

У цьому прикладі ми створюємо контейнер Redis для нашого тесту. Testcontainers автоматично керує життєвим циклом контейнера, запускаючи його перед тестом та зупиняючи після завершення.

Взаємодія з базами даних та API

Testcontainers особливо корисні для тестування взаємодії з базами даних. Ми можемо легко створити контейнер з базою даних, наприклад PostgreSQL:

@Container public PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15.2-alpine");

Це дозволяє нам проводити тести з реальною базою даних, а не з мок-об'єктами. Ми можемо виконувати запити, перевіряти стан бази даних та тестувати складні сценарії.

Для тестування API ми можемо використовувати Testcontainers разом з Selenium. Це дозволяє нам проводити автоматизовані UI-тести у контейнеризованому браузері:

@Container public BrowserWebDriverContainer<?> chrome = new BrowserWebDriverContainer<>()     .withCapabilities(new ChromeOptions());

Перевірка результатів

Після виконання тестових сценаріїв важливо правильно перевірити результати. Ми можемо використовувати стандартні методи асертів для перевірки очікуваних результатів:

@Test public void testDatabaseInteraction() {            String jdbcUrl = postgres.getJdbcUrl();              // Виконуємо операції з базою даних               // ...     assertThat(result).isEqualTo(expectedResult); }

Використання Testcontainers для інтеграційного тестування має багато переваг. Ми можемо створювати ізольовані тестові середовища, які точно відповідають нашому виробничому оточенню. Це підвищує надійність наших тестів та дозволяє виявляти проблеми, які могли б залишитися непоміченими при використанні мок-об'єктів або вбудованих баз даних.

Testcontainers також спрощують процес налаштування тестового середовища, що робить написання та виконання інтеграційних тестів більш доступним для розробників. Це сприяє кращому покриттю коду тестами та підвищенню якості програмного забезпечення в цілому.

Висновок

Testcontainers має значний вплив на інтеграційне тестування в Java-проєктах (і не тільки Java), роблячи процес більш надійним та ефективним. Ця технологія дозволяє розробникам створювати ізольовані тестові середовища, які точно відображають реальні умови експлуатації. Це призводить до підвищення якості тестів та допомагає виявляти проблеми на ранніх етапах розробки. Також, Testcontainers спрощує налаштування тестового середовища, що робить інтеграційне тестування більш доступним для розробників.

У підсумку, Testcontainers — це потужний інструмент, який змінює підхід до інтеграційного тестування. Він дозволяє командам розробників проводити більш ґрунтовні та реалістичні тести, що в кінцевому підсумку покращує якість програмного забезпечення. З огляду на переваги, які надає Testcontainers, його використання стає все більш поширеним у сучасній розробці програмного забезпечення. Це робить Testcontainers важливим інструментом для розробників, які прагнуть підвищити надійність своїх проєктів.

Рекомендуємо подивитися запис вебінару, щоб дізнатися більше про роботу з Testcontainers.

А також не забувайте слідкувати за нашими новинами, адже в EPAM безліч цікавого й корисного. Робити це зручно на наших сторінках у Facebook, Twitter, Telegram або Youtube. А ще радимо заглядати в розклад наших подій на сайті у відповідному розділі — Календар подій.

І, як завжди, дякуємо, що ви з нами!

Підписатися на новини

Чудово! Ми вже готуємо добірку актуальних новин для вас :)

Вибачте, щось пішло не так. Будь ласка, спробуйте ще раз.

* Обов'язкові поля

*Будь ласка, заповніть обов’язкові поля

Вакансії EPAM Ukraine у Київ | Львів | Харків | Дніпро | Вінниця | Івано-Франківськ | Одеса | Чернівці | Хмельницький | Рівне | Ужгород | Тернопіль | Луцьк за напрямком Java | JavaScript | .NET | DevOps | Experience Design | Software Testing | Business Analysis | Python| Big Data | Mobile | Solution Architect | Ruby on Rails у містах за напрямком Java вакансії Київ | Java вакансії Харків | Java вакансії Львів | Java вакансії Вінниця | Java вакансії Одеса | Java вакансії Івано-Франківськ | Java вакансії Чернівці | Java вакансії Хмельницький | Java вакансії Рівне | Java вакансії Ужгород | Java вакансії Тернопіль | Java вакансії Луцьк | JavaScript вакансії Київ | JavaScript вакансії Харків | JavaScript вакансії Львів | JavaScript вакансії Вінниця | JavaScript вакансії Одеса | JavaScript вакансії Івано-Франківськ | JavaScript вакансії Чернівці | JavaScript вакансії Хмельницький | JavaScript вакансії Рівне | JavaScript вакансії Ужгород | JavaScript вакансії Тернопіль | JavaScript вакансії Луцьк | DevOps вакансії Київ | DevOps вакансії Харків | DevOps вакансії Львів | DevOps вакансії Вінниця | DevOps вакансії Одеса | DevOps вакансії Івано-Франківськ | DevOps вакансії Чернівці | DevOps вакансії Хмельницький | DevOps вакансії Рівне | DevOps вакансії Ужгород | DevOps вакансії Тернопіль | DevOps вакансії Луцьк