Я хочу взять 'item' (pytest.Item) из массива 'items' (внутри функции 'pytest_collection_modifyitems') и клонировать этот 'item' и добавить его обратно в массив 'items'.
Если я приведу код ниже (без клонирования), то один сбой при выполнении элемента покажет сбой для другого «элемента» также потому, что оба являются одинаковыми ссылками.
def pytest_collection_modifyitems(session, config, items):
item_1 = items.pop()
items.append(item_1)
items.append(item_1)
yield
Вот почему я хочу клонировать 'item_1' и добавлять к элементам. Так что оба будут отдельным тестом. Один сбой не повлияет на другой предмет. Мои ожидания как ниже
def pytest_collection_modifyitems(session, config, items):
item_1 = items.pop()
# I want this clone_item functionality which should clone the item.
item_2 = clone_item(item_1)
item_2.name = "new_testcase_name"
items.append(item_1)
items.append(item_2)
yield
Для одного из моих вариантов использования мне нужно это требование. Цель не в том, чтобы повторить выполнение тестового примера. Цель состоит в том, чтобы выполнить один и тот же тестовый сценарий на разных этапах / местах, поэтому я вставлю клонированный «элемент» в различные индексы массива «элементы». Кто-нибудь, пожалуйста, сообщите мне, как это сделать?
Позвольте мне объяснить мое требование. 1) Я пишу тест автоматизации для обновления нескольких компонентов. 2) Для этого мне нужно выполнить группу тестов (с использованием маркера pytest) перед обновлением компонента-A. 3) Затем я обновляю компонент-A, выполнив один тестовый пример. Затем снова необходимо выполнить ту же группу тестов снова (с помощью маркера pytest). (может быть еще несколько групп тестов) 4) Затем обновите компонент B, выполнив другой тестовый сценарий. Затем снова необходимо выполнить ту же группу тестов снова (с помощью маркера pytest). (может быть еще несколько групп тестирования) Я должен повторить это для всего доступного количества компонентов, указанных в файле конфигурации. Файл конфигурации будет содержать сведения о том, какие все компоненты должны быть обновлены и какие тестовые сценарии (с именем маркера) должны быть выполнены до и после обновления всех компонентов.
So, I planed to write code as explained in below step.
1) Run pytest CLI by giving root test path(of all test files). So that all the tests are collected by pytest.
2) Read the configuration file (which has the upgrade plan) from 'pytest_collection_modifyitems'
3) Here items list will have all the test Items.
4) Identity which tests to be exuected(from the pytest marker) from the configuration file.
5) Filter those tests usign marker name and put it on another items list (called 'final_items_list'). This final_items_list will be returned from this function
6) Next, Identify what components to be upgraded from the configuration file. Identity the testcase name(which does this componet upgrade) from the items list and put it on the final_items_list.
7) Identity again which tests to be executed after that component upgrade. Now filter those tests using marker name and put it into the final_items_list. Here test items are may be same tests which is collected in step-4.
8) I repeat the same till all components specified in the configuration file.
Here, the final_items_list will have same Items repeated (means same memory reference of items). So if one item(test) fails, then pytest will mark 'fail' for all all other same items as well. And also facing pytest failures when pytest executing same items again. Thats why, I wanted to clone the Item before adding into 'final_items_list'.
Do you have any suggestion to achieve this in pytest?