Skip to content

11. Jenkins. Создаем первую задачу и управляем параметрами Python

BohdanObruch edited this page Jul 1, 2024 · 4 revisions

Что это такое?

Jenkins — система для обеспечения процесса непрерывной интеграции (CI) программного обеспечения. Jenkins написан на Java и у инструмента открытый исходный код.

Как обычно происходит процесс запуска тестов

Локально

Удаленно

Создаём задачу/джобу в Jenkins

Для создания новой задачи необходимо на главной странице(Dashboard) Jenkins кликнуть на кнопку New Item.

Далее указать её название и выбрать тип Freestyle project. Нажимаем OK.

Далее переходим во вкладку Configure.

Настраиваем задачу

Так как на сервере могут работать несколько агентов под разные задачи, то во время настройки задачи необходимо указать актуального Jenkins-агента. В нашем случае мы запускаем тесты на Python, поэтому переходим в настройки задачи, ставим галочку в поле Restrict where this project can be run и в поле Label Expression вводим python.

В блоке Source Code Management выбираем Git и в строку Repository URL вставляем ссылку на репозиторий. Немного проскролив ниже к блоку Branches to build в поле ввода Branch Specifier указываем ветку, которую будем тестировать.

Важно! По умолчанию в поле Branch Specifier указана ветка *master, что означает, что Jenkins будет тестировать эту ветку. Если у вас ветка main или любая другая, то необходимо указать ее заменив значение.

После этого необходимо добавить шаги сборки. Переходим к блоку Build Environment. В разделе Build Steps кликаем на Add build step и в выпадающем списке кликаем на Execute shell.

В появившемся поле вводим следующий скрипт для установки виртуального окружения и запуска тестов которые используют requirements.txt:

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pytest .

Если в проекте используется poetry, то скрипт будет выглядеть следующим образом:

python -m venv .venv
source .venv/bin/activate
pip install poetry 
poetry install
pytest .

Чтобы добавить Allure-отчёт переходим к блоку Post-build Actions, выбираем и кликаем на Add post-build action и в выпадающем списке кликаем на Allure Report. В поле Path проверяем, чтобы путь указывал на правильную директорию в проекте, а именно на allure-results. Нажимаем Save для сохранения настроек.

Добавляем аттачменты

Jenkins в паре с Allure позволяет автоматически запускать тесты и снабжать их подробными отчётами с различными аттачментами: логи, скриншоты, скринкасты, исходный код страницы и другое.

Для этого необходимо сперва добавить некоторые утилиты в код тестов. Для этого в директории utils в проекте создаем файл attach.py и пропишем в нём реализацию аттачментов:

import allure
from allure_commons.types import AttachmentType

# Скриншоты
def add_screenshot(browser):
    png = browser.driver.get_screenshot_as_png()
    allure.attach(body=png, name='screenshot', attachment_type=AttachmentType.PNG, extension='.png')

# логи
def add_logs(browser):
    log = "".join(f'{text}\n' for text in browser.driver.get_log(log_type='browser'))
    allure.attach(log, 'browser_logs', AttachmentType.TEXT, '.log')

# html-код страницы
def add_html(browser):
    html = browser.driver.page_source
    allure.attach(html, 'page_source', AttachmentType.HTML, '.html')

В коде тестов можно вызывать эти функции для добавления необходимых аттачей. К примеру:

attach.add_html(browser)
attach.add_screenshot(browser)
attach.add_logs(browser)

Selenoid

Для добавления Selenoid в проект переходим во вкладку Capabilities, выбираем Python и копируем код.

Далее код необходимо модернизировать:

options = Options()
selenoid_capabilities = {
    "browserName": "chrome",
    "browserVersion": "100.0",
    "selenoid:options": {
        "enableVNC": True,
        "enableVideo": False
    }
}

options.capabilities,update(selenoid_capabilities)
driver = webdriver.Remote(
    command_executor=f"https://{selenoid_login}:{selenoid_pass}@{selenoid_url}/wd/hub",
    options=options)

browser.config.driver = driver

Добавляем видео

Для добавления видео заменим параметр enableVideo из кода выше на True:

options = Options()
selenoid_capabilities = {
    "browserName": "chrome",
    "browserVersion": "100.0",
    "selenoid:options": {
        "enableVNC": True,
        "enableVideo": True
    }
}

options.capabilities,update(selenoid_capabilities)
driver = webdriver.Remote(
    command_executor=f"https://{selenoid_login}:{selenoid_pass}@{selenoid_url}/wd/hub",
    options=options)

browser.config.driver = driver

Далее в файле attach.py добавим соответствующую функцию:

# скринкаст
def add_video(browser):
    video_url = f"{selenoid_url}/video/" + browser.driver.session_id + ".mp4"
    html = "<html><body><video width='100%' height='100%' controls autoplay><source src='" \
           + video_url \
           + "' type='video/mp4'></video></body></html>"
    allure.attach(html, 'video_' + browser.driver.session_id, AttachmentType.HTML, '.html')

Добавить видео в коде теста можно следующим образом:

attach.add_video(browser)

Добавляем .env

Для безопасного хранения конфиденциальной информации, такой как логины, пароли, ключи и т.д., в проекте создаем файл .env и прописываем в нем переменные:

SELENOID_LOGIN=login
SELENOID_PASS=password
SELENOID_URL=selenoid_url

Вместо login, password и selenoid_url прописываем свои значения. Данный файл храниться в .gitignore и не попадает в репозиторий.

Для работы с переменными из файла .env в коде тестов устанавливаем библиотеку python-dotenv:

pip install python-dotenv

В файле conftest.py прописываем:

from dotenv import load_dotenv
import os

@pytest.fixture(scope="session", autouse=True)
def load_env():
    load_dotenv()

selenoid_login = os.getenv("SELENOID_LOGIN")
selenoid_pass = os.getenv("SELENOID_PASS")
selenoid_url = os.getenv("SELENOID_URL")

Добавляем .env в Jenkins

Для того чтобы Jenkins мог использовать переменные из файла .env необходимо их добавить в него. Для этого в блоке Build Steps и кликаем на Add build step и в выпадающем списке кликаем на Create/Update Text File.

В появившемся окне в поле File Path вводим .env, а в поле Text File Content прописываем переменные из файла .env. Обязательно указываем отметки в Create at Workspace и Overwrite file.

Важно! Блок с .env всегда должен быть выше блока с Execute shell. Нажимаем Save для сохранения настроек.

Добавляем параметризацию

Для добавления параметризации необходимо в блоке General поставить галочку в поле This project is parameterized и выбрать тип параметра.

Если выбрать параметр String Parameter то в поле Name вводим имя переменной, а в поле Default Value вводим значение переменной которое будет использоваться по умолчанию.

Если выбрать параметр Choice Parameter то в поле Name вводим имя переменной, а в поле Choices вводим значения переменной в столбик. А в поле Description вводим описание переменной.

При добавлении параметризации в команде запуска тестов необходимо указать переменные. Пример реализации если в коде указаны реализация парсера версии браузера и в jenkins реализуем выбор нужной версии:

pytest  --browser_version=${BROWSER_VERSION}

Если необходимо добавить несколько переменных, то в команде запуска тестов указываем их через пробел.

Если необходимо запустить определенную папку с тестами, то это можно реализовать следующим образом:

Команда запуска тестов будет выглядеть следующим образом:

pytest ${TESTS_TYPE}

Если добавляются параметры, которые не влияют на запуск тестов или на конфигурацию, то изменять команду запуска не нужно.

Изменяем количество отображающихся билдов/прогонов тестов

Для изменения количества отображающихся билдов/прогонов тестов в блоке General ставим отметку Discard old builds. В поле Max # of builds to keep вводим количество отображаемых билдов/прогонов тестов.

Добавляем таймер для запуска тестов

Для добавления таймера для запуска тестов в блоке Build Triggers ставим отметку Build periodically. В поле Schedule вводим время запуска тестов. Для этого можно использовать следующие команды:

Запускать тесты каждый день в 12:00:

H 12 * * *

Запускать тесты каждый понедельник в 12:00:

H 12 * * 1

Запускать тесты каждый час:

H * * * *

Клонирование проекта

Для клонирования проекта необходимо перейти на главной странице(Dashboard) Jenkins кликнуть на кнопку New Item. Указать имя для проекта. Проскролить ниже к блоку Copy from и в поле Name вводим имя проекта, который будем клонировать. Из выпадающего списка выбираем проект, который будем клонировать. Нажимаем OK.

Содержание
Командная строка
Кодировка UTF-8 в Java
Список полезных книг для автоматизаторов тестирования на языке Java
Список полезных книг для автоматизаторов тестирования на языке Python Структура проекта Github README.md

Java:
1. Вводное занятие. Сразу к практике.
2. Git. GitHub. Погружаемся.
3. Погружаемся в инструментарий и библиотеки
4. Основы Java
5. Продолжаем разрабатывать автотесты. PageObjects
6. JUnit 5
7. Allure Reports
8. Работа с файлами
9. Selenide #1
10. Jenkins. Создаем первую задачу
11. Управляем параметрами в коде и в Jenkins
12. Отправляем уведомления о результатах прохождения автотестов
13. Учимся быстро разрабатывать проекты для тестовых заданий
14. Selenoid
15. Библиотека Owner
16. REST API. Пишем автотесты с Rest assured
17. REST API. Декомпозируем UI тесты. Подключаем отчетность
18. REST API. Продолжаем изучать
19. Мобильная автоматизация #1. Разрабатываем автотесты с Browserstack
20. Allure TestOps
21. Переезд на собственную инфраструктуру Java

Python:
1. Вводное занятие. Сразу к практике!
2. Погружаемся в инструментарий и библиотеки
3. Git. GitHub. Погружаемся.
4. Основы Python
5. Selene #1
6. Основы Python. Часть II
7. Основы Python. Часть III
8. Page Object
9. Allure Reports
10. Работаем с файлами Python
11. Jenkins. Создаем первую задачу и управляем параметрами Python
12. Телеграм бот. Отправляем уведомления о результатах прохождения тестов
13. Pytest
14. Selenoid
15. Pytest. Часть II
16. Venv, Poetry и управление зависимостями проекта
17. REST API. Часть I. Пишем автотесты с Requests
18. REST API. Часть II. Продолжаем изучать
19. Мобильная автоматизация #1. Разрабатываем автотесты с Browserstack
20. Мобильная автоматизация #2. Разрабатываем автотесты с эмулятором Android устройства
21. Allure TestOps
22. Переезд на собственную инфраструктуру Python

Clone this wiki locally