Запуск GUI автотестов в GitLab CI\CD с использованием Docker Selenium PyTest

Доброго времени всем.

Может у кого то был опыт по запуску автотестов на PyTest Selenium-standalone и docker в GitLab CI.

Заранее оговорюсь, что опыт по части devOps почти нулевой и буду признателен за конструктивные комментарии.

На данный момент что имеется:

  • проект с автотестами (selenium pytest) на локале
  • все успешно крутится на двух контейнерах (локал), где один - это официальный образ контейнера selenium/standalone-chrome, а второй собирается и коннектится к хосту.

Что не понятно:

  • как раскрутить всю сборку внутри gitlab и корректно настроить пайплайн

Структура локального проекта: SELENIUM/

  • .SELENIUM/pages/
  • .SELENIUM/tests/
  • .SELENIUM/venv/
  • .SELENIUM/conftest.py
  • .SELENIUM/docker-compose.yml
  • .SELENIUM/Dockerfile
  • .SELENIUM/requirements.txt

Схема запуска проста.

1. На локале раним официальный контейнер селениума:

  • docker run -d -p 4444:4444 -p 7900:7900 --shm-size="2g" selenium/standalone-chrome:latest;

2. Через Docker-compose build размечаем оба контейнера именами, портами и объединяем их в одну сеть: ./docker-compose.yml

version: '3'
services:
  selenium:
    image: seleniarm/standalone-chromium:latest
    ports:
      - "4444:4444"
      - "5901:5900"
      - "7900:7900"
    networks:
      - mynetwork

  autotest:
    build:
      context: .
    ports:
      - "4445:4444"
      # - "5902:5900"
      # - "7901:7900"  # Прокинуть порт 4444 контейнера Selenium к порту 4445 контейнера автотестов
    networks:
      - mynetwork

networks:
  mynetwork:

3. В самом Dockerfile описываем, что куда и как копировать, и выполнять: FROM python:3.11.0

  • Устанавливаем docker-compose
RUN apt-get update && apt-get install -y docker-compose
  • Создаем директорию для данных
RUN mkdir /selenium_automatization`
  • Копируем все необходимые файлы и папки
COPY ./requirements.txt /selenium_automatization/app/
COPY ./tests /selenium_automatization/tests
COPY ./pages /selenium_automatization/pages
COPY ./imgMaterials /selenium_automatization/imgMaterials
COPY ./conftest.py /selenium_automatization/conftest.py
  • Устанавливаем рабочую директорию внутри контейнера
WORKDIR /selenium_automatization
  • Устанавливаем зависимости
RUN pip install --upgrade pip && pip install -r /selenium_automatization/app/requirements.txt

4. После всех манипуляций запускаем из терминала:

  • docker-compose down (на всякий случай убили все контейнеры)
  • docker-compose build (собрали все контейнеры заново)
  • docker-compose up -d (стартанули контейнеры с флагом -d для ручного запуска)
  • docker exec -it selenium_python_1 bash (провалились внутрь контейнера с тестами)
  • pytest (запустили тесты, которые подключаются к хосту указанному в conftest.py)

5. Сам conftest.py если кому необходим:

from selenium import webdriver
import pytest

def pytest_addoption(parser):
    parser.addoption("--browser", action="store", default="chrome", help="Specify the browser to use (chrome or firefox)")

@pytest.fixture()
def browser(request):
        options = webdriver.ChromeOptions()
        options.add_argument("--start-maximized")
    
        capabilities = {
            "browserName": "chrome",
            "browserVersion": "114.0",
            "platformName": "linux",
            "se:noVncPort": 7900,
        }
    
        # capabilities = DesiredCapabilities.CHROME.copy()
        capabilities.update(capabilities)
    
        browser = webdriver.Remote(
            command_executor="http://selenium:4444/wd/hub",
            options=options
        )
        browser.maximize_window()
        browser.implicitly_wait(20)
        yield browser
        browser.quit()

6. Итог: После всех вышеперечисленных манипуляций, вся инфраструктура заводится и начинается выполнение тестов Вывод в терминал о выполняющихся тестах

7. Суть вопроса: При попытке вылить все в GitLab столкнулся с массой вопросов и проблем

  • для настройки пайплайна был создан .gitlab-ci-dev.yml в который расписал по стейджам джобы:
stages:
 - build
 - tests

build-selenium:
 stage: build
 only:
  - main
 tags:
  - yc
 before_script:
  - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
 script:
  - echo $BUILD_IMAGE:$BUILD_TAG
  - docker build . -t $BUILD_IMAGE:$BUILD_TAG -f Dockerfile
  - docker push $BUILD_IMAGE:$BUILD_TAG

build-tests:
 stage: build
 only:
  - main
 tags:
  - yc
 before_script:
  - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
 script:
  - echo $BUILD_IMAGE:$BUILD_TAG
  - docker build . -t $BUILD_IMAGE:$BUILD_TAG-tests -f Dockerfile
  - docker push $BUILD_IMAGE:$BUILD_TAG-tests

selenium_test:
 stage: tests
 only:
  - main
 when: manual
 tags:
  - yc
 image: $BUILD_IMAGE:$BUILD_TAG-tests
 script:
  - pytest

Как итог, при попытке завести всю инфраструктуру по ssh не получается, в силу того, что основной контейнер для выполнения тестов, не может стартануть. Второй же (с копией тестов) стартует, но не может подключиться к первому.

Есть ощущение, что я что то упустил из вида, но не пойму что.

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

Большое спасибо за внимание!


Ответы (0 шт):