Найти в Дзене
Анастасия Софт

Continuous Integration и роль тестов в CI/CD пайплайне

Оглавление
Continuous Integration и роль тестов в CI/CD пайплайне
Continuous Integration и роль тестов в CI/CD пайплайне

В мире разработки программного обеспечения концепция 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:

  1. Автоматизация проверки качества кода. Когда код отправляется в репозиторий, CI сервер сразу запускает тесты. Это гарантирует, что ни одна ошибка не попадет в основную ветку разработки.
  2. Снижение времени на ручные проверки. Вместо того чтобы вручную запускать тесты, мы получаем автоматические отчеты по каждому коммиту.
  3. Снижение рисков. Если тесты не проходят, мы сразу видим проблему и можем исправить её до того, как изменения попадут в продуктив.

Настройка тестов в CI/CD пайплайне

Давайте разберемся, как настроить простое CI/CD окружение с тестами. Мы будем использовать GitHub Actions для автоматического выполнения тестов и JUnit для написания тестов. Пример будет простым, чтобы и новичок мог разобраться, но вы сможете адаптировать его под более сложные системы.

Задача 1: Настройка CI пайплайна для Java-проекта с использованием GitHub Actions

Допустим, у вас есть простой Java-проект, и вы хотите, чтобы после каждого коммита выполнялись тесты. GitHub Actions — это отличный инструмент для этого.

  1. Создаем репозиторий на GitHub.
  2. Создаем файл .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.

  1. Создаем коллекцию в Postman для тестирования вашего API.
  2. Экспортируем коллекцию и загружаем её в репозиторий.

Пример пайплайна с использованием 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 пайплайна с тестами значительно улучшит процесс разработки и обеспечит надежность вашего приложения.