Доброго времени суток. Я пишу автотест, который считывает данные из файла, и сверяет с данными в 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(или других способов), передать параметры в тестовый класс в зависимости от опции командной строки?Буду признателен за любые советы или примеры!
Спасибо.