В мире разработки программного обеспечения концепция Continuous Integration (CI) и Continuous Delivery (CD) стала не просто модным словом, а необходимым условием для успешной и стабильной работы над проектами. В этой статье мы разберемся, что такое CI/CD, почему тесты играют ключевую роль в этом процессе и как правильно настроить тесты в CI/CD пайплайне. Мы будем использовать реальный код и примеры, чтобы новичок мог понять основы, а опытный разработчик получил полезные советы для улучшения своего рабочего процесса.
Что такое CI/CD?
Continuous Integration (CI) — это практика, при которой разработчики регулярно (чаще всего несколько раз в день) интегрируют свои изменения в общий репозиторий. Каждое изменение автоматически проверяется с помощью тестов, чтобы выявить ошибки на раннем этапе.
Continuous Delivery (CD) — это логическое продолжение CI. Он включает автоматическое развертывание приложений на тестовые, staging или даже продакшн-сервера. Это позволяет быстрее доставлять новые версии приложения пользователям.
Когда CI и CD работают вместе, они обеспечивают быструю, стабильную и безопасную доставку нового функционала без перебоев в работе системы.
Зачем нам тесты в CI/CD?
В CI/CD пайплайне тесты играют одну из самых важных ролей. Автоматизированные тесты позволяют проверять, что код работает как положено, и обнаруживать баги сразу после их появления. Без тестов можно быстро попасть в ловушку: изменение кода одного разработчика может поломать работу всего приложения.
Роль тестов в CI/CD:
- Автоматизация проверки качества кода. Когда код отправляется в репозиторий, CI сервер сразу запускает тесты. Это гарантирует, что ни одна ошибка не попадет в основную ветку разработки.
- Снижение времени на ручные проверки. Вместо того чтобы вручную запускать тесты, мы получаем автоматические отчеты по каждому коммиту.
- Снижение рисков. Если тесты не проходят, мы сразу видим проблему и можем исправить её до того, как изменения попадут в продуктив.
Настройка тестов в CI/CD пайплайне
Давайте разберемся, как настроить простое CI/CD окружение с тестами. Мы будем использовать GitHub Actions для автоматического выполнения тестов и JUnit для написания тестов. Пример будет простым, чтобы и новичок мог разобраться, но вы сможете адаптировать его под более сложные системы.
Задача 1: Настройка CI пайплайна для Java-проекта с использованием GitHub Actions
Допустим, у вас есть простой Java-проект, и вы хотите, чтобы после каждого коммита выполнялись тесты. GitHub Actions — это отличный инструмент для этого.
- Создаем репозиторий на GitHub.
- Создаем файл .github/workflows/ci.yml для настройки пайплайна.
name: Java CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'adoptopenjdk'
- name: Build with Maven
run: mvn install
- name: Run tests
run: mvn test
Пояснения:
- on.push и on.pull_request — действия, которые будут запускать этот процесс при пуше или pull-запросе в ветку main.
- runs-on: ubuntu-latest — пайплайн будет выполняться на последней версии Ubuntu.
- Мы используем actions/checkout@v2, чтобы загрузить код в окружение CI.
- actions/setup-java@v2 помогает настроить нужную версию Java.
- mvn install собирает проект, а mvn test запускает все тесты, определенные в проекте.
Комментарий:
Этот YAML-файл настроит GitHub Actions таким образом, чтобы каждый раз при пуше в ветку main или создании pull-запроса автоматически выполнялись тесты. Это один из самых простых примеров CI.
Задача 2: Написание теста с использованием JUnit
Давайте теперь напишем простейший тест для нашего Java-проекта, используя JUnit 5.
Пример простого теста (Java + JUnit):
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
int result = calculator.add(2, 3);
assertEquals(5, result, "2 + 3 should equal 5");
}
}
Комментарий:
Этот тест проверяет, что метод add() из класса Calculator правильно складывает два числа. Мы используем assertEquals, чтобы сравнить ожидаемый результат с реальным. Если числа не совпадут, тест не пройдет.
Задача 3: Тестирование API с использованием Postman и GitHub Actions
Теперь давайте рассмотрим задачу для более опытных разработчиков — тестирование REST API с использованием Postman и GitHub Actions.
- Создаем коллекцию в Postman для тестирования вашего API.
- Экспортируем коллекцию и загружаем её в репозиторий.
Пример пайплайна с использованием Newman (CLI для Postman):
name: API Test CI
on:
push:
branches:
- main
jobs:
api-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Install Newman
run: npm install -g newman
- name: Run Postman tests
run: newman run my_collection.json
Комментарий:
Этот пайплайн скачивает коллекцию Postman, выполняет тесты с помощью Newman и проверяет, что API работает корректно. Если один из тестов не проходит, это приведет к сбою пайплайна.
Задача 4: Тестирование UI с Cypress
Для профессионалов, работающих с фронтендом, удобным инструментом для автоматизации UI-тестирования является Cypress.
Пример теста с Cypress:
describe('Login Test', () => {
it('should log in with valid credentials', () => {
cy.visit('https://example.com/login');
cy.get('#username').type('user');
cy.get('#password').type('password');
cy.get('#loginButton').click();
cy.url().should('include', '/dashboard');
});
});
Комментарий:
Cypress легко интегрируется с CI/CD пайплайнами и позволяет писать тесты для проверки пользовательского интерфейса. Этот тест проверяет, что при вводе правильных данных в форму логина мы попадаем на страницу дашборда.
Задача 5: Использование параллельных тестов с CircleCI
Для продвинутых пользователей развертывание и тестирование в параллельном режиме помогает ускорить процесс CI/CD. Рассмотрим пример с CircleCI.
Пример конфигурации с CircleCI:
version: 2.1
jobs:
test:
docker:
- image: cypress/included:6.0.0
steps:
- checkout
- run:
name: Install dependencies
command: npm install
- run:
name: Run tests
command: npm test
workflows:
version: 2
test:
jobs:
- test
Комментарий:
Здесь мы настраиваем CircleCI для выполнения Cypress-тестов. Благодаря использованию Docker-контейнеров CircleCI может запустить тесты в параллельном режиме, что существенно ускоряет выполнение тестов.
Заключение
Как видите, Continuous Integration (CI) и Continuous Delivery (CD) — это мощные инструменты для повышения качества разработки. Важной частью этого процесса являются тесты. Мы рассмотрели несколько примеров для новичков и профессионалов: от простых юнит-тестов до тестирования API и UI. Важно, чтобы ваши тесты выполнялись автоматически в CI/CD пайплайне, что позволяет снизить риски и повысить качество программного обеспечения.
Автоматизация тестирования — это не просто задача для улучшения качества, но и необходимый элемент для быстрой и стабильной разработки. Независимо от вашего уровня, настройка CI/CD пайплайна с тестами значительно улучшит процесс разработки и обеспечит надежность вашего приложения.