testit-tms / adapters-python

Apache License 2.0
10 stars 11 forks source link

При запуске параметризованных тестов в TestIT создаётся только 1 автотест #147

Closed RomanFedyunin2 closed 2 months ago

RomanFedyunin2 commented 2 months ago

testit-adapter-pytest 3.2.1 testit-api-client 4.0.0 testit-python-commons 3.2.1 pytest 8.2.2 python 3.12

Пример теста

import pytest

class TestTest:
    @pytest.mark.parametrize('param', [0, 1])
    def test_test(self, param):
        assert 1 == 1

В TestIT ещё нет этих автотестов.

Запуск с tmsAdapterMode=2

Ожидаемый результат: создано 2 теста в TestIT Фактический результат: создан 1 тест в TestIT

RomanFedyunin2 commented 2 months ago

Возможно связано с https://github.com/testit-tms/adapters-python/issues/43

RomanFedyunin2 commented 2 months ago

Это решается, если указывать externalId для теста с соответствующим параметром.

Например так

import pytest
import testit

class TestTest:
    @testit.externalId('test_test{param}')
    @pytest.mark.parametrize('param', [0, 1])
    def test_test(self, param):
        assert 1 == 1

И это будет корректней для связи с ручными тестами.

Но мне кажется стоит учитывать параметры и в случае автоматической генерации externalId.

Сейчас в случае, если не указан externalId, он генериться так

item.test_external_id = utils.get_hash(item.parent.nodeid + item.function.__name__)

Наименование метода для параметризованных тестов одинаковое. Соответственно получается одинаковый test_external_id.

В примере выше, без указания @testit.externalId('test_test{param}'), для двух тестов хеш вычисляется от такой строки tests/jobs/test_test.py::TestTesttest_test (с учётом струкруры проекта)


Можно, например, вместо этого генерировать externalId так

item.test_external_id = utils.get_hash(''.join(item.nodeid.split('::')[-2:]))

И аналогично использовать str(item.nodeid.split('::')[-1]) в качестве наименования автотестов в TestIT (но это, наверное, уже отдельная тема)

Или использовать просто item.nodeid в качестве уникального наименования при генерации externalId.

Note: не тестировал подробно предложенные решения. Это только пример

RomanFedyunin2 commented 2 months ago

Потестил ещё немного.

Текущее поведение выглядит логичным. При выполнении одного автотеста из TestIT, который связан с параметризованным тестом в pytest в Прогоне мы видим несколько результатов (для каждого параметра).

Соответтсвенно при добавлении новых параметров в этот тест, у нас по прежнему останется 1 тест в TestIT, но при выполнении будут учтены все новые параметры (в отличие от варианта создания разных автотестов в TestIT на каждый параметр).