Pytest - Извлекать данные, сгенерированные при тестовом прогоне, в файл / фикстуру в conftest? - PullRequest
0 голосов
/ 16 марта 2020

Я использую фреймворк Pytest для тестирования веб-приложений. Во время выполнения тестов он генерирует данные и сохраняет их в переменных.

Пример:

@pytest.mark.usefixture("test_setup")
class TestArticleCreation:
    def test_new_article_creation(self):
        art = ArticleCreation(self.driver)
        art.create_new_article()
        article_id = art.get_new_article_id()
        assert art.verify_article_created_in_db(article_id)

Я хочу извлечь article_id и сохранить его, чтобы потом его можно было удалить, но я делаю Я не хочу, чтобы процесс извлечения идентификаторов был частью самого теста, даже если я не могу думать / знать о каком-либо другом способе сделать это, кроме добавления функции в тест, которая запишет значение article_id в файл. Предоставляет ли Pytest решение для этого?

Я использую conftest.py для создания конфигураций, и проект создается с использованием шаблона проектирования POM, если это как-то помогает.

Заранее спасибо.

1 Ответ

0 голосов
/ 17 марта 2020

Я нашел хорошее решение, но не уверен, что оно лучшее. Можно извлечь переменные из уровня модуля,

Итак, над TestClass я объявил новую переменную type (list). Когда тест генерирует идентификатор, я могу добавить его в приведенный выше список,

# tests/test_sanity.py
article_ids = []

@pytest.mark.usefixtures("test_setup")  # USE "test_setup"   FIXTURE with scope=class
class TestSanity:

    def test_global_var(self):
        art_id = '12321342154'
        global article_ids  # Declare the in module var as global
        article_ids.append(art_id)  # Add id generated in test run
        assert article_id == '12321342154'


# conftest.py

@pytest.mark.hookwrapper  # Add hook wrapper to tests teardown
def pytest_runtest_teardown(item):
    yield
    print(item.module.article_ids)  # By this access the global var decalred in our test module

Единственная проблема, с которой я сталкиваюсь сейчас, - это оболочка перехвата, называемая каждым тестом, а не за сеанс.

Редактировать :

Найден другой способ сделать это:

@pytest.fixture(scope="session")
def ids():
    ids = []
    yield ids
    print(ids)


@pytest.fixture(scope="class")
def api_setup(request, ids):
    request.cls.ids = ids

@pytest.mark.usefixtures("api_setup") 
class TestSome:
    def test_something(self):
        global article_ids
        art_id = '123'
        self.ids.append(art_id)
        assert art_id == '123'

Таким образом он добавляет каждый идентификатор, сгенерированный в список, но не вызывает conftest.py в конце каждого теста

...