Акции и промокоды Отзывы о школах

Как проводить тестирование с использованием Jenkins

#Блог

В современном мире разработки ПО, где релизы происходят часто, автоматизация тестирования стала не роскошью, а жизненной необходимостью.

Jenkins давно один из широко известных и распространенных инструментов для автоматизации CI/CD процессов. Сегодня мы разберем, как превратить этого «железного дворецкого» разработки в эффективного помощника для автоматизации тестирования — от установки до создания полноценных пайплайнов.

Что такое Jenkins и зачем он нужен тестировщику

Jenkins — это open-source сервер автоматизации, который можно смело назвать швейцарским ножом в мире CI/CD. Этот инструмент появился на свет в далеком 2011 году (когда динозавры DevOps еще не вымерли) и с тех пор стал де-факто стандартом для автоматизации процессов сборки, тестирования и развертывания.

Для тестировщика дженкинс — это возможность забыть о рутинном запуске тестов после каждого коммита и сосредоточиться на более интересных задачах (например, на написании новых тестов или поиске багов, которые разработчики клятвенно уверяют, что «не могут существовать в принципе»).

Ключевые возможности Jenkins:

  • Автоматический запуск тестов по триггерам (коммит, расписание, webhook).
  • Интеграция с более чем 1800 плагинами — от Git до Slack.
  • Поддержка распределенных сборок на множестве машин.
  • Генерация подробных отчетов о результатах тестирования.
  • Настройка уведомлений о статусе сборки.
  • Возможность создания сложных пайплайнов как кода.
Параметр Jenkins TeamCity GitLab CI CircleCI
Лицензия Open Source Коммерческая Freemium Коммерческая
Плагины 1800+ Ограничено Встроенные Ограничено
Кривая обучения Высокая Средняя Низкая Низкая
Гибкость Максимальная Высокая Средняя Средняя
sravnenie-cicd

Визуальное сравнение гибкости, кривой обучения и числа плагинов у четырёх CI/CD инструментов. Диаграмма подчеркивает сильные стороны Jenkins по плагинам и гибкости.

Преимущества и недостатки

Как и любой инструмент, созданный людьми (а не искусственным интеллектом — пока что), дженкинс имеет свои светлые и темные стороны. Давайте разберем их честно, без маркетинговой мишуры.

Преимущества Jenkins для тестирования:

  • Бесплатность — в отличие от многих конкурентов, Jenkins не выпрашивает деньги за базовый функционал.
  • Гибкость настройки — можно настроить практически любой сценарий тестирования, даже самый извращенный.
  • Огромная экосистема плагинов — если чего-то нет, то либо это не нужно, либо кто-то уже написал плагин.
  • Активное сообщество — на Stack Overflow найдется ответ почти на любой вопрос (правда, иногда через 47 страниц поиска).
  • Масштабируемость — можно развернуть от одного сервера до целой фермы агентов.
  • Pipeline as Code — возможность версионировать процессы CI/CD вместе с кодом.

Недостатки Jenkins:

  • Сложность первичной настройки — новичок может потратить неделю, чтобы запустить простейший тест.
  • Устаревший интерфейс — выглядит так, будто его дизайнили в эпоху Windows XP.
  • Высокие требования к обслуживанию — плагины конфликтуют, обновления ломают настройки.
  • Ресурсоемкость — может съесть оперативку как голодный студент пиццу.
  • Отсутствие встроенной отказоустойчивости — если master упал, все встает колом.
  • Безопасность требует внимания — из коробки не самый защищенный инструмент.

Когда стоит использовать Jenkins для тестов

Не каждый проект нуждается в дженкинс — иногда это как покупать Ferrari для поездок в ближайший магазин. Но есть ситуации, когда без этого «монстра автоматизации» жизнь превращается в ад тестировщика.

Jenkins становится незаменимым помощником, когда ваша команда разработки работает активнее, чем пчелы в период медосбора — то есть коммиты летят каждый час, а то и чаще. В таких условиях ручное тестирование после каждого изменения превращается в сизифов труд, только камень тяжелеет с каждым днем.

Типовые кейсы использования Jenkins в QA:

  • Regression testing после каждого коммита — автоматический запуск полного набора тестов для проверки, что новый код не сломал старый функционал.
  • Мультиплатформенное тестирование — одновременный запуск тестов на Windows, Linux, macOS и различных версиях браузеров.
  • Ночные прогоны тестов — длительные тесты производительности или интеграционные тесты, которые выполняются по расписанию.
  • Тестирование на разных окружениях — автоматическое развертывание и тестирование на dev, staging, pre-prod средах.
  • API и нагрузочное тестирование — регулярные проверки производительности и стабильности сервисов.
  • Smoke testing перед релизом — быстрая проверка критически важного функционала перед деплоем в продакшн.
kejsy-jenkins-qa


Горизонтальная диаграмма, показывающая распределение ключевых сценариев применения Jenkins в тестировании. Самая большая доля приходится на регрессионное тестирование.

Особенно Jenkins блещет в проектах с микросервисной архитектурой, где изменение в одном сервисе может неожиданно сломать интеграцию с десятком других. Здесь автоматизация тестирования — не просто удобство, а вопрос выживания команды и ее психического здоровья.

Как установить и настроить Jenkins

Установка дженкинс — это как сборка мебели из IKEA: кажется простой до тех пор, пока не начинаешь разбираться с инструкцией. Но не волнуйтесь, я проведу вас через этот квест без лишних синяков на пальцах.

Jenkins

Скриншот страницы загрузки Jenkins (кнопки LTS/Weekly, платформы).

Первое и главное требование — Java 11 или выше.

Пошаговая установка:

  1. Подготовка системы — убедитесь, что Java JDK установлена (java -version в командной строке не должна ругаться)
  2. Загрузка — идем на jenkins.io/download и скачиваем нужную версию (LTS рекомендуется для продакшена)
  3. Установка по платформам:
  • Windows: запускаем .msi файл и следуем мастеру установки
  • Linux Ubuntu/Debian: добавляем репозиторий и устанавливаем через apt
  • Docker: docker run -p 8080:8080 jenkins/jenkins:lts
  1. Первый запуск — открываем браузер, переходим на localhost:8080, вводим admin пароль из файла (путь покажет сам Jenkins)
  2. Установка плагинов — выбираем «Install suggested plugins» или настраиваем вручную (для новичков лучше первый вариант)
  3. Создание admin пользователя — заполняем форму, не забываем записать пароль (серьезно, запишите!)

Jenkins можно также развернуть в облаке через CloudBees или использовать managed-решения от крупных провайдеров. Docker-вариант особенно удобен для экспериментов — можно быстро поднять, потестировать, снести и забыть как страшный сон.

Важный момент: после установки обязательно настройте backup стратегию. Потерять конфигурацию дженкинс после месяцев настройки — это как потерять сохранение в RPG на финальном боссе.

Первичная настройка и создание проекта

После успешной установки дженкинс встречает вас интерфейсом, который выглядит так, будто его дизайнили программисты для программистов в 2005 году (что, собственно, недалеко от истины). Но не дайте этому винтажному виду обмануть себя — под капотом скрывается мощнейший инструмент автоматизации.

Создание первого проекта в Jenkins — это ритуал посвящения в мир CI/CD. Кликаем на «New Item» (или «Создать элемент» в русской локализации) и попадаем в меню выбора типа проекта. Здесь важно понимать разницу между основными вариантами:

Freestyle project — это классический подход, где вы настраиваете все через веб-интерфейс, кликая по чекбоксам и заполняя поля. Идеально для начинающих и простых задач. Думайте о нем как о «конструкторе Lego» — все наглядно, но ограничено предустановленными блоками.

Pipeline — современный подход «infrastructure as code», где вся логика CI/CD описывается в специальном файле Jenkinsfile. Это как писать программу для автоматизации — гибко, версионируется вместе с кодом, но требует знания синтаксиса Pipeline DSL.

Для первого опыта выбираем Freestyle project и называем его осмысленно — например, «MyApp-Tests» вместо «Test123» (поверьте, через полгода вы не вспомните, что тестировал «Test123»).

В разделе «Source Code Management» указываем Git-репозиторий. Здесь же настраиваем аутентификацию — дженкинс может работать с SSH-ключами, токенами или username/password (последний вариант менее безопасен, но проще для старта). Не забудьте указать нужную ветку — по умолчанию Jenkins пытается использовать master/main, но ваши тесты могут жить в отдельной ветке develop или feature/tests.

В разделе «Build Triggers» настраиваем, когда должны запускаться тесты: по коммиту в репозиторий (через webhook), по расписанию (cron-like синтаксис) или вручную. Для начала можно оставить ручной запуск — так безопаснее экспериментировать.

Настройка тестирования

Теперь переходим к самому интересному — заставляем дженкинс не просто скачивать код, а реально запускать тесты. Это как научить собаку не только приносить тапочки, но и проверять их на чистоту.

В разделе «Build Steps» добавляем команды для запуска тестов. Jenkins не умеет читать мысли (пока что), поэтому нужно четко прописать, что и как запускать. Выбираем «Execute shell» (для Linux/Mac) или «Execute Windows batch command» (для Windows) и пишем команды так, будто объясняем инопланетянину, как заварить чай.

Типичные команды выглядят примерно так:

  • Для Python: python -m pytest tests/ —junitxml=reports/results.xml
  • Для Java/Maven: mvn clean test -Dmaven.test.failure.ignore=true
  • Для Node.js: npm test — —reporter=xunit —outputFile=test-results.xml

Ключевой момент — генерация XML-отчетов в формате JUnit. Даже если ваши тесты написаны на Python, JavaScript или Ruby, большинство фреймворков умеют выдавать результаты в JUnit-совместимом формате. Это как универсальный переводчик между вашими тестами и дженкинс.

В разделе «Post-build Actions» добавляем «Publish JUnit test result report» и указываем путь к XML-файлам с результатами (например, **/test-results.xml или reports/*.xml). Jenkins проанализирует эти файлы и создаст красивые графики с трендами прохождения тестов — зеленые столбики радуют глаз, красные заставляют искать виноватых.

Также можно настроить архивирование артефактов сборки (скриншоты упавших тестов, логи, отчеты coverage) в разделе «Archive the artifacts». Указываем паттерн файлов типа screenshots/*.png, logs/*.log и Jenkins сохранит все это богатство для последующего анализа.

JUnit, TestNG, PyTest — примеры подключения

Каждый тестовый фреймворк имеет свои особенности генерации отчетов, но принцип один — получить XML в понятном Jenkins формате:

 

# PyTest (Python)

pytest tests/ --junitxml=junit.xml --html=report.html --self-contained-html

# TestNG (Java)

mvn test -DsuiteXmlFile=testng.xml

# Jest (JavaScript)

npm test -- --ci --reporters=default --reporters=jest-junit

В Jenkinsfile это выглядит элегантнее:

stage('Test') {

steps {

sh 'pytest tests/ --junitxml=results.xml'

}

post {

always {

junit 'results.xml'

publishHTML([allowMissing: false, alwaysLinkToLastBuild: true,

keepAll: true, reportDir: 'htmlcov', reportFiles: 'index.html',

reportName: 'Coverage Report'])

}

}

}

Работа с отчётами: Allure, HTML, email и Slack

Генерировать отчеты о тестировании и никому их не показывать — это как готовить ужин и есть его в темноте. Jenkins умеет не только собирать результаты тестов, но и красиво их презентовать, а также уведомлять всех заинтересованных лиц о том, что произошло (особенно когда что-то пошло не так).

Allure Report — это, пожалуй, самый стильный способ показать результаты тестирования. Этот инструмент превращает скучные XML-отчеты в интерактивную веб-страницу с графиками, временными линиями и подробной информацией о каждом тесте. Установить Allure плагин — дело нескольких кликов через «Manage Plugins».

После установки добавляем в Post-build Actions пункт «Allure Report» и указываем путь к результатам (обычно allure-results/). Jenkins автоматически сгенерирует отчет и добавит ссылку на него в интерфейс сборки. Результат выглядит так профессионально, что можно не стыдиться показать даже топ-менеджменту.

HTML Publisher плагин позволяет публиковать любые HTML-отчеты — от coverage отчетов до кастомных дашбордов. Настройка простая: указываем директорию с HTML-файлами, главный файл (обычно index.html) и название отчета.

Email Extension плагин превращает дженкинс в персонального секретаря, который рассылает уведомления о результатах сборки. Можно настроить отправку писем только при падении тестов, при восстановлении после падения, или вообще всегда (но тогда коллеги могут начать игнорировать ваши письма как спам).

Slack Notifier — современная альтернатива email для команд, которые живут в Slack. Настраиваете webhook, и дженкинс будет постить результаты прямо в нужный канал с эмодзи и ссылками на детальные отчеты. Особенно эффектно выглядят уведомления с красными крестиками, когда кто-то сломал тесты на master ветке — публичный позор иногда работает лучше любых процессов код-ревью.

Пример настройки в Jenkinsfile:

post {

always {

allure([includeProperties: false, jdk: '', results: [[path: 'allure-results']]])

}

failure {

slackSend channel: '#qa-alerts',

color: 'danger',

message: "Tests failed! Build: ${env.BUILD_URL}"

}

}

Пример Jenkins Pipeline: пошаговый сценарий

Freestyle проекты — это хорошо для начала, но настоящие профессионалы используют Pipeline as Code. Это как переход от рисования в Paint к профессиональному Photoshop — сначала кажется сложно, но потом уже не хочется возвращаться к примитивным инструментам.

Jenkinsfile — это специальный файл, который описывает весь процесс CI/CD на языке Groovy (не пугайтесь, синтаксис довольно простой). Главное преимущество такого подхода — вся логика сборки версионируется вместе с кодом, и изменения можно отслеживать через Git.

Вот пример базового Jenkinsfile для Java проекта с Maven:

pipeline {

agent any

tools {

maven 'Maven-3.8.1'

jdk 'JDK-11'

}

stages {

stage('Checkout') {

steps {

echo 'Получаем свежий код из репозитория...'

checkout scm

}

}

stage('Build') {

steps {

echo 'Компилируем проект...'

sh 'mvn clean compile'

}

}

stage('Test') {

steps {

echo 'Запускаем тесты...'

sh 'mvn test -Dmaven.test.failure.ignore=true'

}

post {

always {

junit '**/target/surefire-reports/TEST-*.xml'

publishHTML([

allowMissing: false,

alwaysLinkToLastBuild: true,

keepAll: true,

reportDir: 'target/site/jacoco',

reportFiles: 'index.html',

reportName: 'Coverage Report'

])

}

}

}

stage('Package') {

steps {

echo 'Собираем артефакт...'

sh 'mvn package -DskipTests'

archiveArtifacts artifacts: 'target/*.jar', fingerprint: true

}

}

}

post {

always {

echo 'Очищаем workspace...'

cleanWs()

}

success {

echo 'Все прошло успешно! 🎉'

}

failure {

echo 'Что-то пошло не так... 😢'

emailext (

subject: "Build Failed: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",

body: "Build failed. Check console output at ${env.BUILD_URL}",

to: "${env.CHANGE_AUTHOR_EMAIL}"

)

}

}

}

Для Python проекта с PyTest логика похожая, но команды другие:

pipeline {

agent any

stages {

stage('Setup') {

steps {

sh 'python -m pip install --upgrade pip'

sh 'pip install -r requirements.txt'

}

}

stage('Test') {

steps {

sh 'python -m pytest tests/ --junitxml=results.xml --cov=src --cov-report=html'

}

post {

always {

junit 'results.xml'

publishHTML([

allowMissing: false,

alwaysLinkToLastBuild: true,

keepAll: true,

reportDir: 'htmlcov',

reportFiles: 'index.html',

reportName: 'Coverage Report'

])

}

}

}

}

}

Логика каждого блока:

  • Checkout — Jenkins автоматически скачивает код из Git репозитория.
  • Build — компилируем код и устанавливаем зависимости.
  • Test — запускаем тесты и генерируем отчеты.
  • Package — создаем финальный артефакт для деплоя.

Секция post выполняется независимо от результата сборки и позволяет делать cleanup, отправлять уведомления или архивировать артефакты. Это как блок finally в программировании — выполнится в любом случае.

Расширенные возможности для автоматизации

Когда базовые пайплайны начинают казаться слишком простыми (что само по себе тревожный признак — возможно, вы уже слишком глубоко погрузились в мир DevOps), дженкинс предлагает целый арсенал продвинутых возможностей. Эти инструменты превращают обычный CI/CD пайплайн в швейцарский армейский нож автоматизации.

Параметры сборки позволяют делать пайплайны интерактивными. Вместо хардкода можно добавить параметры: какую ветку тестировать, какие тесты запускать, на каком окружении развертывать. В Jenkinsfile это выглядит так:

pipeline {

agent any

parameters {

choice(name: 'ENVIRONMENT', choices: ['dev', 'staging', 'prod'], description: 'Target environment')

booleanParam(name: 'RUN_INTEGRATION_TESTS', defaultValue: true, description: 'Run integration tests?')

string(name: 'TEST_TAG', defaultValue: 'smoke', description: 'Test tag to run')

}

stages {

stage('Test') {

when { params.RUN_INTEGRATION_TESTS }

steps {

sh "pytest -m ${params.TEST_TAG} --env=${params.ENVIRONMENT}"

}

}

}

}

Параллельное выполнение — когда у вас тысячи тестов, и ждать их последовательного выполнения все равно что смотреть, как сохнет краска.

effekt-parallelnogo-zapuska

Диаграмма сокращения времени выполнения набора тестов при увеличении степени параллелизма. При 4× время выполнения снижается более чем в три раза.

Jenkins умеет распараллеливать задачи:

stage('Parallel Tests') {

parallel {

stage('Unit Tests') {

steps { sh 'pytest tests/unit/' }

}

stage('Integration Tests') {

steps { sh 'pytest tests/integration/' }

}

stage('UI Tests') {

steps { sh 'pytest tests/ui/' }

}

}

}

Shared Libraries — это как создание собственной библиотеки функций для дженкинс. Можно вынести часто используемую логику в отдельный репозиторий и переиспользовать в разных проектах. Особенно полезно для компаний с десятками проектов — вместо копипасты одного и того же кода создаете функцию deployToKubernetes() и используете везде.

Условия (when) добавляют интеллекта в пайплайны. Можно запускать определенные стадии только при соблюдении условий:

stage('Deploy to Production') {

when {

allOf {

branch 'main'

not { changeRequest() }

environment name: 'DEPLOY_ENV', value: 'prod'

}

}

steps {

echo 'Deploying to production...'

}

}

Эти возможности превращают простой пайплайн сборки в умную систему, которая принимает решения на основе контекста. Правда, с большой силой приходит большая ответственность — сложные пайплайны требуют сложной отладки.

Безопасность и управление доступом

Безопасность в Jenkins — это как замки на входной двери: кажется очевидным, пока кто-то не забывает их поставить, а потом удивляется, почему все секреты компании оказались в публичном доступе. К сожалению, в мире существует слишком много дженкинс инстансов, которые работают с настройками «по умолчанию», что примерно как оставлять ключи в замке зажигания.

Jenkins из коробки не блещет параноидальным уровнем безопасности — он больше ориентирован на функциональность, чем на защиту. Поэтому первое, что нужно сделать после установки — настроить аутентификацию и авторизацию.

В разделе «Manage Jenkins» → «Configure Global Security» можно выбрать стратегию безопасности. Для небольших команд подойдет встроенная база пользователей дженкинс, для корпоративной среды лучше интегрироваться с LDAP/Active Directory или SAML. Matrix-based security позволяет гранулярно настроить права: кто может читать логи, кто может запускать сборки, а кто может вообще все сломать (обычно это админы).

Credential Store — это встроенное хранилище секретов дженкинс. Здесь можно безопасно сохранить пароли, API ключи, SSH ключи и сертификаты. Главное правило — никогда не хардкодить секреты в Jenkinsfile или скриптах сборки. Вместо этого используйте credentials binding:

environment {

API_KEY = credentials('my-api-key')

DB_PASSWORD = credentials('database-password')

}

Jenkins шифрует все credentials с помощью AES и master key, который хранится отдельно. Но если кто-то получит доступ к файловой системе сервера, то может извлечь и расшифровать секреты — поэтому важно защищать сам сервер на уровне ОС.

Разделение ролей особенно важно в больших командах. Разработчики должны видеть только свои проекты, тестировщики — только результаты тестов, а менеджеры — только красивые дашборды (и желательно всегда зеленые). Role-based Authorization Strategy плагин позволяет создавать гибкие политики доступа.

Также стоит регулярно аудировать установленные плагины — некоторые из них могут иметь уязвимости безопасности. Jenkins Security Advisory регулярно публикует информацию о найденных проблемах. Автоматические обновления — это палка о двух концах: с одной стороны, закрывают дыры в безопасности, с другой — могут сломать существующие настройки.

Заключение

Jenkins — это как швейцарский армейский нож в мире автоматизации тестирования: мощный, универсальный, но требующий определенной сноровки, чтобы не порезать себе пальцы. После многих лет работы с различными CI/CD инструментами могу сказать одно — Jenkins остается одним из самых гибких решений на рынке, несмотря на свой винтажный интерфейс и иногда причудливое поведение. Подведм итоги:

  • Jenkins автоматизирует выполнение тестов. Это экономит время тестировщика и сокращает количество ручных операций.
  • Интеграция с фреймворками и инструментами расширяет возможности тестирования. Это позволяет адаптировать процесс под разные проекты и технологии.
  • Плагины и пайплайны повышают гибкость настройки. Это помогает реализовать сложные сценарии тестирования без доработки кода.
  • Отчёты и уведомления обеспечивают прозрачность QA-процесса. Это позволяет быстро выявлять ошибки и реагировать на сбои.
  • Настройки безопасности защищают данные и доступы. Это снижает риски утечек и несанкционированных изменений в проекте.

Если только начинаете осваивать профессию тестировщика, рекомендуем обратить внимание на подборку курсов по QA-тестирования. В них есть теоретическая и практическая часть, включая настройку Jenkins и интеграцию с тестовыми фреймворками. Такой формат обучения поможет быстрее освоить CI/CD и уверенно применять навыки в реальных проектах.

Читайте также
Категории курсов