Как параметризовать функцию для 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
Другие вопросы по тегам