Как параметризовать функцию для pytest так, чтобы параметры и название теста были взяты из текстового файла
Как параметризовать функцию для pytest таким образом, чтобы параметр брался из текстового файла, а имя функции изменяется на каждой итерации для отчета pytest-html
формат текстового файла: имя_функции | assert_value | Запрос на утверждение от postgresql.
требование: создать основанную на Pytest структуру
пока что с моей логикой (это не работает):
with open("F_Query.txt","r") as ins1:
for F_Query in ins1:
#Name of function to be executed to be extracted from the file differentiated with delimeter " | "(leading and trailing space required)
F_name=F_Query.split(" | ")[0]
assert_val=F_Query.split(" | ")[1]
Query=F_Query.split(" | ")[2]
Loc_file=(Query.split(" ")[-5:])[0]
def f(text):
def r(y):
return y
r.__name__ = text
return r
c1.execute(Query)
assert(c1.rowcount() == assert_val), "Please check output file for records"
p = f(F_name)
Может кто-нибудь объяснить, как изменить имя функции при каждой итерации, в то время как параметры передаются в удовольствие от Pytest
latest changes (still doesn't work):
with open("F_Query.txt","r") as ins1:
for F_Query in ins1:
#Name of function to be executed to be extracted from the file differentiated with delimeter " | "(leading and trailing space required)
#F_name=F_Query.split(" | ")[0]
assert_val=int(F_Query.split(" | ")[1])
Query=F_Query.split(" | ")[2]
Query=Query.strip("\n")
#Loc_file=(Query.split(" ")[-5:])[0]
dictionary1[Query]=assert_val
@pytest.mark.parametrize('argumentname',dictionary1)
def test_values(argumentname):
c1.execute(dictionary1.keys(argumentname))
assert(c1.rowcount==dictionary1.values(argumentname))
0 ответов
Я бы предложил другой подход: вместо того, чтобы пытаться параметризовать отдельный тест, напишите пользовательский тестовый элемент, в котором вы можете задать имя теста. Пример: код ниже будет читать F_Query.txt
файл и создать тест для каждой строки, которая выполняет запрос (я использовал sqlite3
для тестирования) и сравните результат с ожидаемым значением. Поместите код в conftest.py
файл.
# conftest.py
import sqlite3
import pytest
def pytest_collect_file(parent, path):
if path.basename == 'F_Query.txt':
return Queries(path, parent)
class Queries(pytest.File):
def collect(self):
with self.fspath.open() as fp:
for line in fp:
(name, expected, query_string) = line.split(' | ')
yield QueryTest(name, self, expected, query_string)
class QueryTest(pytest.Item):
def __init__(self, name, parent, expected, query):
super(QueryTest, self).__init__(name, parent)
self.expected = expected
self.query = query
def runtest(self):
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute(self.query)
assert self.expected == c.fetchone()
Теперь сгенерированные тесты будут иметь имя того, что помещено в F_Query.txt
:
$ pytest --collect-only -q
so-51496798/F_Query.txt::spam
so-51496798/F_Query.txt::eggs
so-51496798/F_Query.txt::bacon