Задать вопрос
@ABCTEST

Как в pytest добавить параметризациию теста в зависимости от опции командной строки?

Доброго времени суток. Я пишу автотест, который считывает данные из файла, и сверяет с данными в CRM системе. Считанные данные из файла передаются в качестве параметров в тестовый класс. Вот фрагмент моего кода:

from pages.products import ProductsBaseTest
from utils.utils import read_file
import pytest

def file_data():
    folder_path = "data"
    sorted_product_list = read_file(f"{folder_path}/data.DBF").sort_values('CODE')
    return [(code, dbf_data) for code, dbf_data in sorted_product_list.groupby('CODE')]

@pytest.fixture(scope="session")
def product_properties(db_connection):
    return db_connection

@pytest.mark.parametrize("code, dbf_data", file_data())
class TestDBF(ProductsBaseTest):

    dbf_data = None
    crm_data = None

    @pytest.fixture(autouse=True)
    def getting_crm_data(self, code, dbf_data, product_properties):
        conn = product_properties
        cur = conn.cursor()
        cur.execute(f"SELECT * FROM crm_products WHERE PRODUCT_ID={code}")
        self.crm_data = cur.fetchone()
        self.dbf_data = {
            row['PAYF_FORM']: row['PRICE'] for index, row in dbf_data.iterrows() \
            if row['PAY_FORM'] not in [700001, 700004]
        }

    def test_check_site_price(self):
        assert float(self.dbf_data['site_price']) == float(self.crm_data[4])

    def test_check_moc_price(self):
        assert float(self.dbf_data['moc_price']) == float(self.crm_data[5])

    def test_cgeck_mrc_price(self):
        assert float(self.dbf_data['mrc_price']) == float(self.crm_data[6])

    def test_check_rrc_price(self):
        assert float(self.dbf_data['rrc_price']) == float(self.crm_data[7].split("|")[0])

    def test_check_base_price(self):
        assert float(self.dbf_data['base_price']) == float(self.crm_data[16])


Требуется скорректировать предусловия следующим образом: в зависимости от значения опции "--env", в командной строке, считывать либо локальный файл, либо с ftp, и передать полученный данные в качестве параметров.

Я пробовал реализовать это с помощью хука pytest_generate_tests, но он загружает данные для каждого тестового метода - этот вариант мне не подходит, т.к. считываемый файл содержит большое количество данных. Решил использовать хук pytest_collection_modifyitems, чтобы передать параметры перед запуском тестов, но параметризация не срабатывает. Мой код:

import tempfile
from utils.server_client import ServerClient

def pytest_collection_modifyitems(session, config, items):
    env = config.getoption("env")
    if env == "prod":
        server_client = ServerClient("http://example/")
        file_dbf = server_client.ftp_file_reader("data.DBF")
        # Записываем содержимое удаленного файла во временный файл
        with tempfile.NamedTemporaryFile(suffix=".DBF", delete=True) as temp_file:
            temp_file.write(file_dbf)
            temp_file.flush()
            sorted_product_list = read_file(temp_file.name).sort_values('CODE')
            data = [(code, dbf_data) for code, dbf_data in sorted_product_list.groupby('CODE')]
            for item in items:
                if "TestDBF" in item.nodeid:
                    item.add_marker(pytest.mark.parametrize("code, dbf_data", data))
    elif env == "dev":
        folder_path = "data"
        sorted_product_list = read_file(f"{folder_path}/data.DBF").sort_values('CODE')
        data = [(code, dbf_data) for code, dbf_data in sorted_product_list.groupby('CODE')]
        for item in items:
            if "TestDBF" in item.nodeid:
                item.add_marker(pytest.mark.parametrize("code, dbf_data", data))
    else:
        pytest.fail(reason="Передан неизвестный параметр: {}".format(env))


Подскажите, как с помощью хуков pytest(или других способов), передать параметры в тестовый класс в зависимости от опции командной строки?Буду признателен за любые советы или примеры!
Спасибо.
  • Вопрос задан
  • 31 просмотр
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы