Отказ от ответственности: первое сообщение о stackoverflow, совершенно новое для pytest. Заранее спасибо!
Я часть новой команды контроля качества в компании. Сейчас мы концентрируемся на создании начальных тестов для различных API синхронизации (большинство из них отправляют/получают данные из базы данных SQL).
Мы используем python/pytest.
Каждый API имеет автоматически сгенерированный файл. пакет Python, который мы используем при тестировании этого API.
Каждый пакет имеет модуль «Конфигурация», модуль «ApiClient» и различные модули API для разных частей API.
наша файловая структура для тестирования:< /p>
API-тесты
│
├─ _init_.py
├─ conftest.py
│(различные API)
├─ CloudControlDbAPI
├─ WeatherForecastDbAPI
├─ WeatherForecastAPI
└─ AssetConfigurationProvider ├─ **conftest.py**
└─ tests
├─ test_battery_api.py
├─ test_battery_inverter_api.py
├─ test_device_api.py
└─ data (data folder with some known objects used for testing.
В «корневом» файле конфигурации:
import inspect
import re
import pytest
# get args
__options = ['host', 'username', 'password']
def pytest_addoption(parser):
for opt in __options:
parser.addoption(f'--{opt}')
# init module
@pytest.fixture
def api(config, api_client, module, request):
args = {k: request.config.getoption(k) for k in __options if request.config.getoption(k)}
config = config(**args)
api = api_client(configuration=config, header_name='Test', header_value=0)
api = module(api_client=api)
return api
Фикстура api() — это то, что мы в конечном итоге используем в тестах. он использует «config», «api_client» и «module».
Каждый API имеет разные модули «Configuration» и «ApiClient», а также различные «модули» API.
Каждая папка API (CloudControlDbAPI/WeatherForecastAPI/AssetConfigurationProvider) имеет собственный файл conftest.py:
from {API}_python_client import Configuration, ApiClient
import inspect
import re
import pytest
# Init #
@pytest.fixture(scope='session')
def config():
return Configuration
@pytest.fixture(scope='session')
def api_client():
return ApiClient
@pytest.fixture(scope='session')
def file_path():
return __file__
поэтому имена Configuration и ApiClient одинаковы, но для каждого API они взяты из разных пакетов.
Например, в < strong>WeatherForecastDbAPI:
from WeatherForecastApis.WeatherForecastDb_python_client import Configuration, ApiClient
В AssetConfigurationProvider:
from AssetConfigurationDataProvider_python_client import Configuration, ApiClient
Некоторые API имеют один API-модуль, а некоторые — несколько.
Каждый тестовый файл имел собственное приспособление модуля:
from AssetConfigurationDataProvider_python_client import **BatteryApi**
from data.batteries import *
import pytest
@pytest.fixture(scope='module')
def module():
return **BatteryApi**
# Tests #
@pytest.mark.parametrize("known_battery", known_batteries_list)
def test_get_battery_by_id(**api: BatteryApi**, known_battery: Battery):
res = api.get_battery_by_id(known_battery.site_entity_id)
assert res.model.model_id == known_battery.model_id
assert res.parameters == known_battery.parameters
Каждый тест использует приспособление api() из «корневого» теста, который использует приспособления config/api_client/module из дочернего конфликта каждого API.
Вопрос в следующем!
Как мы можем изменить наши conftest/fixtures, чтобы иметь возможность использовать несколько модулей API в одном файле или даже в тот же тест?
Сейчас фикстура api() наследует фикстуру "module" из файла, из которого выполняется тест, но что, если мы хотим использовать "BatteryApi" и Модули «BatteryManagingApi» в одном файле/тесте?
что мы можем изменить в структуре приспособления API или приспособления модуля, чтобы иметь возможность использовать как BatteryManagingApi, так и BatteryApi в одном тесте?
from AssetConfigurationDataProvider_python_client import BatteryManagingApi, BatteryApi
@pytest.fixture(scope='module')
def module():
return BatteryManagingApi
Я пытался создать класс, содержащий все используемые нами приспособления, но не уверен, что это лучшая практика, или есть более простой способ, я просто не вижу o_O
что я пробовал:
class Bse_Test_Api:
def __init__(self, config, api_client):
self._config = config
self._api_client = api_client
# self._module_list = module_list
def api(self, module, **args):
config = self._config(**args)
api = self._api_client(configuration=config, header_name='Test', header_value=0)
api = module(api_client=api)
return api
Подробнее здесь: https://stackoverflow.com/questions/783 ... sting-file
Как использовать несколько модулей API в одном файле тестирования? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение