Запуск тестов (pytest) на разном окружении (локально и в Jenkins)

Привет!

Я тестирую (pytest) некий сервис, который получает запросы от клиента, что-то делает внутри себя и записывает результаты в БД.

У нас есть три окружения:

  1. QA - я отлаживаю и запускаю тесты в PyCharm;
  2. CI - после отладки тесты вместе с conftest.py заливается в SVN, откуда их берёт и запускает Jenkins;
  3. DEV - программисты тоже запускают тесты в PyCharm на собственном окружении;

Сейчас я тупо храню все параметры (адреса сервера, БД, логины/пароли и т. д.) в conftest.py
и для запуска теста на другом окружении его требуется каждый раз править. Да и это просто некрасиво :slight_smile:

Пример conftest.py и тестового скрипта:

# conftest.py:
SERVER_IP = "192.168.1.1"
SERVER_PORT = 12345

DB_IP = "192.168.1.2"
DB_SID = "service"
DB_LOGIN = "admin"
DB_PASSWORD = "admin"

@pytest.fixture(scope="session")
def client():
    _s = Client()
    _s.connect(SERVER_IP, SERVER_PORT)
    yield _s

@pytest.fixture(scope="session")
def db():
    _db = DB()
    _db.connect(DB_LOGIN, DB_PASSWORD, DB_IP, DB_SID)
    yield _db


# test_1.py:
def test_1(client, db):
	client.send_request()
	client.receive_reply()
	db.get_result()

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

1 лайк

Если требуется запускать тесты с разными параметрами, то можно в параметрах запусках их указывать
python test_1.py --DB_IP ="192.168.1.2" --DB_SID ="service"

и парсить в конфиге

def pytest_addoption(parser):
    parser.addoption("--DB_IP ", action="store", help="description")
    ...

к тесту создать фикстуру

@pytest.fixture
def db_ip(request):
    return request.config.getoption("DB_IP")
2 лайка

Ещё вариант передавать через переменные окружения (в Jenkins можно их передавать и сделать select-box для всех возможных значений)
И сделать какие-то значения по умолчанию.
Например, адреса на которых обычно локально поднимается приложение:

import os

SERVER_IP = os.environ.get(“SERVER_IP”, “192.168.1.1”)

можно будет из консоли не изменяя conftest.py(вообще обычно для этого делают отдельный файл - config.py) задавать нужные значения при локальном запуске:

export SERVER_IP=http://localhost

2 лайка

Друзья, спасибо за ответы!

А вы можете примерно описать структуру своего тестового проекта?
У меня сейчас так:

..
\resourse  #какие-то статичные ресурсы, необходимые для тестов 
\common  #описания тестовых классов и вспомогательные функции
conftest.py
test_1.py
test_2.py

\configs (папка с конфигом страниц, локаторами, тестдатой)
\pages (Page Object Pattern)
\tests (сами тесты)
.gitignore
conftest.py (shared фикстуры для всех тестов, добавление кастомных ключей pytest)
pytest.ini (ключи pytest по дефолту)

Вот такая структура для WEB UI автотестов

4 лайка

А можете показать содержимое \configs?

1 лайк


config_loader.py
locators.yaml
pages_config.yaml
users.yaml

Эта папка добавляется в пути поиска python пакетов, как и pages, затем в base_page.py лоадер парсит и передает все конфиги. Все страницы, унаследованные от суперкласса имеют эти значения.
Впринципе, все по дефолту

1 лайк