From 6f5ef56cb87e2b8fcb1c21013b26af0959d8fe51 Mon Sep 17 00:00:00 2001 From: Eliram Shatz Date: Thu, 28 Jan 2021 11:39:58 -0800 Subject: [PATCH 01/12] fix issue with fixture value in feature file, when the value is dict --- allure-pytest-bdd/setup.py | 28 ++++--- allure-pytest-bdd/src/helper.py | 50 ++++++++++++ allure-pytest-bdd/src/plugin.py | 44 +++++++++- allure-pytest-bdd/src/pytest_bdd_listener.py | 10 ++- allure-pytest-bdd/src/utils.py | 86 +++++++++++++++++++- 5 files changed, 202 insertions(+), 16 deletions(-) create mode 100644 allure-pytest-bdd/src/helper.py diff --git a/allure-pytest-bdd/setup.py b/allure-pytest-bdd/setup.py index bf166279..69dd716e 100644 --- a/allure-pytest-bdd/setup.py +++ b/allure-pytest-bdd/setup.py @@ -19,22 +19,25 @@ 'Programming Language :: Python :: 3.11', ] -setup_requires = [ - "setuptools_scm" -] +# setup_requires = [ + # "setuptools_scm" +# ] install_requires = [ "pytest>=4.5.0", - "pytest-bdd>=3.0.0" + "pytest-bdd>=3.0.0", + "six>=1.9.0", + "allure-python-commons==2.9.43", ] -def prepare_version(): - from setuptools_scm import get_version - configuration = {"root": "..", "relative_to": __file__} - version = get_version(**configuration) - install_requires.append(f"allure-python-commons=={version}") - return configuration +# def prepare_version(): +# # from setuptools_scm import get_version +# # configuration = {"root": "..", "relative_to": __file__} +# # version = get_version(**configuration) +# # install_requires.append(f"allure-python-commons=={version}") +# install_requires.append("allure-python-commons==2.8.32") +# # return configuration def get_readme(fname): @@ -44,7 +47,8 @@ def get_readme(fname): def main(): setup( name=PACKAGE, - use_scm_version=prepare_version, + version="2.8.32-eliram01282021", + # use_scm_version=prepare_version, description="Allure pytest-bdd integration", url="https://github.com/allure-framework/allure-python", author="QAMetaSoftware, Stanislav Seliverstov", @@ -56,7 +60,7 @@ def main(): packages=["allure_pytest_bdd"], package_dir={"allure_pytest_bdd": "src"}, entry_points={"pytest11": ["allure_pytest_bdd = allure_pytest_bdd.plugin"]}, - setup_requires=setup_requires, + # setup_requires=setup_requires, install_requires=install_requires ) diff --git a/allure-pytest-bdd/src/helper.py b/allure-pytest-bdd/src/helper.py new file mode 100644 index 00000000..240c945f --- /dev/null +++ b/allure-pytest-bdd/src/helper.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import pytest +import allure_commons +from .utils import ALLURE_DESCRIPTION_MARK, ALLURE_DESCRIPTION_HTML_MARK +from .utils import ALLURE_LABEL_MARK, ALLURE_LINK_MARK + + +class AllureTitleHelper(object): + @allure_commons.hookimpl + def decorate_as_title(self, test_title): + def decorator(func): + # pytest.fixture wraps function, so we need to get it directly + if getattr(func, '__pytest_wrapped__', None): + function = func.__pytest_wrapped__.obj + else: + function = func + function.__allure_display_name__ = test_title + return func + + return decorator + + +class AllureTestHelper(object): + def __init__(self, config): + self.config = config + + @allure_commons.hookimpl + def decorate_as_description(self, test_description): + allure_description = getattr(pytest.mark, ALLURE_DESCRIPTION_MARK) + return allure_description(test_description) + + @allure_commons.hookimpl + def decorate_as_description_html(self, test_description_html): + allure_description_html = getattr(pytest.mark, ALLURE_DESCRIPTION_HTML_MARK) + return allure_description_html(test_description_html) + + @allure_commons.hookimpl + def decorate_as_label(self, label_type, labels): + allure_label = getattr(pytest.mark, ALLURE_LABEL_MARK) + return allure_label(*labels, label_type=label_type) + + @allure_commons.hookimpl + def decorate_as_link(self, url, link_type, name): + pattern = dict(self.config.option.allure_link_pattern).get(link_type, u'{}') + url = pattern.format(url) + allure_link = getattr(pytest.mark, ALLURE_LINK_MARK) + name = url if name is None else name + return allure_link(url, name=name, link_type=link_type) diff --git a/allure-pytest-bdd/src/plugin.py b/allure-pytest-bdd/src/plugin.py index a5620264..377cc9e7 100644 --- a/allure-pytest-bdd/src/plugin.py +++ b/allure-pytest-bdd/src/plugin.py @@ -1,8 +1,13 @@ +import argparse + import allure_commons import os from allure_commons.logger import AllureFileLogger from .pytest_bdd_listener import PytestBDDListener +from .utils import ALLURE_DESCRIPTION_MARK, ALLURE_DESCRIPTION_HTML_MARK +from .utils import ALLURE_LABEL_MARK, ALLURE_LINK_MARK +from .helper import AllureTestHelper, AllureTitleHelper def pytest_addoption(parser): parser.getgroup("reporting").addoption('--alluredir', @@ -17,6 +22,30 @@ def pytest_addoption(parser): dest="clean_alluredir", help="Clean alluredir folder if it exists") + parser.getgroup("general").addoption('--allure-environmant-vars-to-tag', + action="store", + dest="env_vars_to_tag", + help="Comma-separated list of environment varibales to add as tags") + + def link_pattern(string): + pattern = string.split(':', 1) + if not pattern[0]: + raise argparse.ArgumentTypeError('Link type is mandatory.') + + if len(pattern) != 2: + raise argparse.ArgumentTypeError('Link pattern is mandatory') + return pattern + + parser.getgroup("general").addoption('--allure-link-pattern', + action="append", + dest="allure_link_pattern", + metavar="LINK_TYPE:LINK_PATTERN", + default=[], + type=link_pattern, + help="""Url pattern for link type. Allows short links in test, + like 'issue-1'. Text will be formatted to full url with python + str.format().""") + def cleanup_factory(plugin): def clean_up(): @@ -24,15 +53,23 @@ def clean_up(): allure_commons.plugin_manager.unregister(name=name) return clean_up +def pytest_addhooks(pluginmanager): + # Need register title hooks before conftest init + title_helper = AllureTitleHelper() + allure_commons.plugin_manager.register(title_helper) def pytest_configure(config): report_dir = config.option.allure_report_dir clean = config.option.clean_alluredir + test_helper = AllureTestHelper(config) + allure_commons.plugin_manager.register(test_helper) + config.add_cleanup(cleanup_factory(test_helper)) + if report_dir: report_dir = os.path.abspath(report_dir) - pytest_bdd_listener = PytestBDDListener() + pytest_bdd_listener = PytestBDDListener(config) config.pluginmanager.register(pytest_bdd_listener) allure_commons.plugin_manager.register(pytest_bdd_listener) config.add_cleanup(cleanup_factory(pytest_bdd_listener)) @@ -40,3 +77,8 @@ def pytest_configure(config): file_logger = AllureFileLogger(report_dir, clean) allure_commons.plugin_manager.register(file_logger) config.add_cleanup(cleanup_factory(file_logger)) + + config.addinivalue_line("markers", "{mark}: allure label marker".format(mark=ALLURE_LABEL_MARK)) + config.addinivalue_line("markers", "{mark}: allure link marker".format(mark=ALLURE_LINK_MARK)) + config.addinivalue_line("markers", "{mark}: allure description".format(mark=ALLURE_DESCRIPTION_MARK)) + config.addinivalue_line("markers", "{mark}: allure description html".format(mark=ALLURE_DESCRIPTION_HTML_MARK)) diff --git a/allure-pytest-bdd/src/pytest_bdd_listener.py b/allure-pytest-bdd/src/pytest_bdd_listener.py index 9a4f5fac..47709647 100644 --- a/allure-pytest-bdd/src/pytest_bdd_listener.py +++ b/allure-pytest-bdd/src/pytest_bdd_listener.py @@ -4,6 +4,7 @@ from allure_commons.utils import uuid4 from allure_commons.model2 import Label from allure_commons.model2 import Status +from allure_commons.model2 import Link from allure_commons.types import LabelType from allure_commons.utils import platform_label @@ -18,9 +19,11 @@ from allure_commons.lifecycle import AllureLifecycle from .utils import get_full_name, get_name, get_params +from .utils import allure_description, pytest_markers, allure_labels, allure_links, get_tags_from_environment_vars class PytestBDDListener: - def __init__(self): + def __init__(self, config): + self.config = config self.lifecycle = AllureLifecycle() self.host = host_tag() self.thread = thread_tag() @@ -43,11 +46,16 @@ def pytest_bdd_before_scenario(self, request, feature, scenario): test_result.name = name test_result.start = now() test_result.historyId = md5(request.node.nodeid) + test_result.labels.extend([Label(name=name, value=value) for name, value in allure_labels(request.node)]) + test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in get_tags_from_environment_vars(self.config.option.env_vars_to_tag)]) + test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in pytest_markers(request.node)]) test_result.labels.append(Label(name=LabelType.HOST, value=self.host)) test_result.labels.append(Label(name=LabelType.THREAD, value=self.thread)) test_result.labels.append(Label(name=LabelType.FRAMEWORK, value="pytest-bdd")) test_result.labels.append(Label(name=LabelType.LANGUAGE, value=platform_label())) test_result.labels.append(Label(name=LabelType.FEATURE, value=feature.name)) + test_result.description = allure_description(request.node) + test_result.links.extend([Link(link_type, url, name) for link_type, url, name in allure_links(request.node)]) test_result.parameters = get_params(request.node) finalizer = partial(self._scenario_finalizer, scenario) diff --git a/allure-pytest-bdd/src/utils.py b/allure-pytest-bdd/src/utils.py index ac70aac2..b5df408a 100644 --- a/allure-pytest-bdd/src/utils.py +++ b/allure-pytest-bdd/src/utils.py @@ -1,14 +1,32 @@ import os from uuid import UUID from allure_commons.utils import md5 +from allure_commons.utils import represent from allure_commons.model2 import StatusDetails from allure_commons.model2 import Status from allure_commons.model2 import Parameter from allure_commons.utils import format_exception +from allure_commons.types import LabelType +ALLURE_DESCRIPTION_MARK = 'allure_description' +ALLURE_DESCRIPTION_HTML_MARK = 'allure_description_html' +ALLURE_LABEL_MARK = 'allure_label' +ALLURE_LINK_MARK = 'allure_link' +ALLURE_UNIQUE_LABELS = [ + LabelType.SEVERITY, + LabelType.FRAMEWORK, + LabelType.HOST, + LabelType.SUITE, + LabelType.PARENT_SUITE, + LabelType.SUB_SUITE +] -def get_step_name(step): - return f"{step.keyword} {step.name}" +def get_step_name(node, step): + name = "{step_keyword} {step_name}".format(step_keyword=step.keyword, step_name=step.name) + if hasattr(node, 'callspec'): + for key, value in node.callspec.params.items(): + name = name.replace(key, value) + return name def get_name(node, scenario): @@ -48,3 +66,67 @@ def get_params(node): outline_params = params.pop('_pytest_bdd_example', {}) params.update(outline_params) return [Parameter(name=name, value=value) for name, value in params.items()] + + +def get_marker_value(item, keyword): + marker = item.get_closest_marker(keyword) + return marker.args[0] if marker and marker.args else None + + +def allure_description(item): + description = get_marker_value(item, ALLURE_DESCRIPTION_MARK) + if description: + return description + elif hasattr(item, 'function'): + return item.function.__doc__ + + +def pytest_markers(item): + for keyword in item.keywords.keys(): + if any([keyword.startswith('allure_'), keyword == 'parametrize']): + continue + marker = item.get_closest_marker(keyword) + if marker is None: + continue + + yield mark_to_str(marker) + + +def allure_labels(item): + unique_labels = dict() + labels = set() + for mark in item.iter_markers(name=ALLURE_LABEL_MARK): + label_type = mark.kwargs["label_type"] + if label_type in ALLURE_UNIQUE_LABELS: + if label_type not in unique_labels.keys(): + unique_labels[label_type] = mark.args[0] + else: + for arg in mark.args: + labels.add((label_type, arg)) + for k, v in unique_labels.items(): + labels.add((k, v)) + return labels + + +def mark_to_str(marker): + args = [represent(arg) for arg in marker.args] + kwargs = ['{name}={value}'.format(name=key, value=represent(marker.kwargs[key])) for key in marker.kwargs] + if marker.name in ('filterwarnings', 'skip', 'skipif', 'xfail', 'usefixtures', 'tryfirst', 'trylast'): + markstr = '@pytest.mark.{name}'.format(name=marker.name) + else: + markstr = '{name}'.format(name=marker.name) + if args or kwargs: + parameters = ', '.join(args + kwargs) + markstr = '{}({})'.format(markstr, parameters) + return markstr + + +def allure_links(item): + for mark in item.iter_markers(name=ALLURE_LINK_MARK): + yield (mark.kwargs["link_type"], mark.args[0], mark.kwargs["name"]) + +def get_tags_from_environment_vars(env_vars_list): + tags = set() + for var_name in env_vars_list.split(','): + tags.add(f"{var_name}: {os.environ.get(var_name)}") + return tags From d93e98fe51e5919c6229f4de42bfb26212a24270 Mon Sep 17 00:00:00 2001 From: Michael Hasibo Date: Sat, 4 Sep 2021 21:35:42 +0300 Subject: [PATCH 02/12] first commit --- allure-pytest-bdd/src/pytest_bdd_listener.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allure-pytest-bdd/src/pytest_bdd_listener.py b/allure-pytest-bdd/src/pytest_bdd_listener.py index 47709647..930d89d8 100644 --- a/allure-pytest-bdd/src/pytest_bdd_listener.py +++ b/allure-pytest-bdd/src/pytest_bdd_listener.py @@ -37,7 +37,7 @@ def _scenario_finalizer(self, scenario): self.lifecycle.stop_step(uuid=step_uuid) @pytest.hookimpl - def pytest_bdd_before_scenario(self, request, feature, scenario): + def pytest_bdd_after_scenario(self, request, feature, scenario): uuid = get_uuid(request.node.nodeid) full_name = get_full_name(feature, scenario) name = get_name(request.node, scenario) From 603456945b949bbd6cc1ab9d54ff344842501a21 Mon Sep 17 00:00:00 2001 From: Michael Hasibo Date: Sat, 4 Sep 2021 21:58:27 +0300 Subject: [PATCH 03/12] added prints --- allure-pytest-bdd/src/pytest_bdd_listener.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/allure-pytest-bdd/src/pytest_bdd_listener.py b/allure-pytest-bdd/src/pytest_bdd_listener.py index 930d89d8..8934135a 100644 --- a/allure-pytest-bdd/src/pytest_bdd_listener.py +++ b/allure-pytest-bdd/src/pytest_bdd_listener.py @@ -36,11 +36,18 @@ def _scenario_finalizer(self, scenario): step_result.status = Status.SKIPPED self.lifecycle.stop_step(uuid=step_uuid) + + @pytest.hookimpl + def pytest_bdd_before_scenario(self, request, feature, scenario): + print("allure_before") + @pytest.hookimpl def pytest_bdd_after_scenario(self, request, feature, scenario): + print("allure_after") uuid = get_uuid(request.node.nodeid) full_name = get_full_name(feature, scenario) name = get_name(request.node, scenario) + with self.lifecycle.schedule_test_case(uuid=uuid) as test_result: test_result.fullName = full_name test_result.name = name From 4f37402460bd0c1a4285d876215b151243bb8105 Mon Sep 17 00:00:00 2001 From: Michael Hasibo Date: Sat, 4 Sep 2021 22:29:21 +0300 Subject: [PATCH 04/12] added both hooks --- allure-pytest-bdd/src/pytest_bdd_listener.py | 23 ++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/allure-pytest-bdd/src/pytest_bdd_listener.py b/allure-pytest-bdd/src/pytest_bdd_listener.py index 8934135a..dcdb16b7 100644 --- a/allure-pytest-bdd/src/pytest_bdd_listener.py +++ b/allure-pytest-bdd/src/pytest_bdd_listener.py @@ -40,6 +40,29 @@ def _scenario_finalizer(self, scenario): @pytest.hookimpl def pytest_bdd_before_scenario(self, request, feature, scenario): print("allure_before") + uuid = get_uuid(request.node.nodeid) + full_name = get_full_name(feature, scenario) + name = get_name(request.node, scenario) + + with self.lifecycle.schedule_test_case(uuid=uuid) as test_result: + test_result.fullName = full_name + test_result.name = name + test_result.start = now() + test_result.historyId = md5(request.node.nodeid) + test_result.labels.extend([Label(name=name, value=value) for name, value in allure_labels(request.node)]) + test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in get_tags_from_environment_vars(self.config.option.env_vars_to_tag)]) + test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in pytest_markers(request.node)]) + test_result.labels.append(Label(name=LabelType.HOST, value=self.host)) + test_result.labels.append(Label(name=LabelType.THREAD, value=self.thread)) + test_result.labels.append(Label(name=LabelType.FRAMEWORK, value="pytest-bdd")) + test_result.labels.append(Label(name=LabelType.LANGUAGE, value=platform_label())) + test_result.labels.append(Label(name=LabelType.FEATURE, value=feature.name)) + test_result.description = allure_description(request.node) + test_result.links.extend([Link(link_type, url, name) for link_type, url, name in allure_links(request.node)]) + test_result.parameters = get_params(request.node) + + finalizer = partial(self._scenario_finalizer, scenario) + request.node.addfinalizer(finalizer) @pytest.hookimpl def pytest_bdd_after_scenario(self, request, feature, scenario): From 41818342285ccaac2e664059f88c3c5744c29435 Mon Sep 17 00:00:00 2001 From: Michael Hasibo Date: Thu, 9 Sep 2021 18:17:19 +0300 Subject: [PATCH 05/12] changed after scenario hook --- allure-pytest-bdd/src/pytest_bdd_listener.py | 28 ++------------------ 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/allure-pytest-bdd/src/pytest_bdd_listener.py b/allure-pytest-bdd/src/pytest_bdd_listener.py index dcdb16b7..63533174 100644 --- a/allure-pytest-bdd/src/pytest_bdd_listener.py +++ b/allure-pytest-bdd/src/pytest_bdd_listener.py @@ -67,35 +67,11 @@ def pytest_bdd_before_scenario(self, request, feature, scenario): @pytest.hookimpl def pytest_bdd_after_scenario(self, request, feature, scenario): print("allure_after") - uuid = get_uuid(request.node.nodeid) - full_name = get_full_name(feature, scenario) - name = get_name(request.node, scenario) - - with self.lifecycle.schedule_test_case(uuid=uuid) as test_result: - test_result.fullName = full_name - test_result.name = name - test_result.start = now() - test_result.historyId = md5(request.node.nodeid) - test_result.labels.extend([Label(name=name, value=value) for name, value in allure_labels(request.node)]) - test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in get_tags_from_environment_vars(self.config.option.env_vars_to_tag)]) - test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in pytest_markers(request.node)]) - test_result.labels.append(Label(name=LabelType.HOST, value=self.host)) - test_result.labels.append(Label(name=LabelType.THREAD, value=self.thread)) - test_result.labels.append(Label(name=LabelType.FRAMEWORK, value="pytest-bdd")) - test_result.labels.append(Label(name=LabelType.LANGUAGE, value=platform_label())) - test_result.labels.append(Label(name=LabelType.FEATURE, value=feature.name)) - test_result.description = allure_description(request.node) - test_result.links.extend([Link(link_type, url, name) for link_type, url, name in allure_links(request.node)]) - test_result.parameters = get_params(request.node) - - finalizer = partial(self._scenario_finalizer, scenario) - request.node.addfinalizer(finalizer) - - @pytest.hookimpl - def pytest_bdd_after_scenario(self, request, feature, scenario): + print(get_tags_from_environment_vars(self.config.option.env_vars_to_tag)) uuid = get_uuid(request.node.nodeid) with self.lifecycle.update_test_case(uuid=uuid) as test_result: test_result.stop = now() + test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in get_tags_from_environment_vars(self.config.option.env_vars_to_tag)]) @pytest.hookimpl def pytest_bdd_before_step(self, request, feature, scenario, step, step_func): From 32ba0006841da619bbd989211f187fb02e16910d Mon Sep 17 00:00:00 2001 From: Michael Hasibo Date: Thu, 9 Sep 2021 18:21:14 +0300 Subject: [PATCH 06/12] changed after scenario hook 2 --- allure-pytest-bdd/src/pytest_bdd_listener.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allure-pytest-bdd/src/pytest_bdd_listener.py b/allure-pytest-bdd/src/pytest_bdd_listener.py index 63533174..12727cad 100644 --- a/allure-pytest-bdd/src/pytest_bdd_listener.py +++ b/allure-pytest-bdd/src/pytest_bdd_listener.py @@ -39,7 +39,7 @@ def _scenario_finalizer(self, scenario): @pytest.hookimpl def pytest_bdd_before_scenario(self, request, feature, scenario): - print("allure_before") + print("allure_before!") uuid = get_uuid(request.node.nodeid) full_name = get_full_name(feature, scenario) name = get_name(request.node, scenario) From c1ed2bfc9f43370ece8de42ca2c99a05141ac715 Mon Sep 17 00:00:00 2001 From: Michael Hasibo Date: Mon, 13 Sep 2021 20:13:05 +0300 Subject: [PATCH 07/12] removed prints --- allure-pytest-bdd/src/pytest_bdd_listener.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/allure-pytest-bdd/src/pytest_bdd_listener.py b/allure-pytest-bdd/src/pytest_bdd_listener.py index 12727cad..4f7826ff 100644 --- a/allure-pytest-bdd/src/pytest_bdd_listener.py +++ b/allure-pytest-bdd/src/pytest_bdd_listener.py @@ -39,7 +39,6 @@ def _scenario_finalizer(self, scenario): @pytest.hookimpl def pytest_bdd_before_scenario(self, request, feature, scenario): - print("allure_before!") uuid = get_uuid(request.node.nodeid) full_name = get_full_name(feature, scenario) name = get_name(request.node, scenario) @@ -66,8 +65,6 @@ def pytest_bdd_before_scenario(self, request, feature, scenario): @pytest.hookimpl def pytest_bdd_after_scenario(self, request, feature, scenario): - print("allure_after") - print(get_tags_from_environment_vars(self.config.option.env_vars_to_tag)) uuid = get_uuid(request.node.nodeid) with self.lifecycle.update_test_case(uuid=uuid) as test_result: test_result.stop = now() From 8b90a1e0f6973aeea7300b47281e2ec1a3510183 Mon Sep 17 00:00:00 2001 From: "gil.becker" Date: Mon, 10 Apr 2023 16:56:29 +0300 Subject: [PATCH 08/12] lint fix --- allure-pytest-bdd/src/plugin.py | 4 ++ allure-pytest-bdd/src/pytest_bdd_listener.py | 42 +++++++++++--------- allure-pytest-bdd/src/utils.py | 13 +++--- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/allure-pytest-bdd/src/plugin.py b/allure-pytest-bdd/src/plugin.py index 377cc9e7..0f1f6fed 100644 --- a/allure-pytest-bdd/src/plugin.py +++ b/allure-pytest-bdd/src/plugin.py @@ -9,6 +9,7 @@ from .helper import AllureTestHelper, AllureTitleHelper + def pytest_addoption(parser): parser.getgroup("reporting").addoption('--alluredir', action="store", @@ -51,13 +52,16 @@ def cleanup_factory(plugin): def clean_up(): name = allure_commons.plugin_manager.get_name(plugin) allure_commons.plugin_manager.unregister(name=name) + return clean_up + def pytest_addhooks(pluginmanager): # Need register title hooks before conftest init title_helper = AllureTitleHelper() allure_commons.plugin_manager.register(title_helper) + def pytest_configure(config): report_dir = config.option.allure_report_dir clean = config.option.clean_alluredir diff --git a/allure-pytest-bdd/src/pytest_bdd_listener.py b/allure-pytest-bdd/src/pytest_bdd_listener.py index 4f7826ff..5419d2eb 100644 --- a/allure-pytest-bdd/src/pytest_bdd_listener.py +++ b/allure-pytest-bdd/src/pytest_bdd_listener.py @@ -1,25 +1,26 @@ -import pytest +from functools import partial + import allure_commons -from allure_commons.utils import now -from allure_commons.utils import uuid4 +import pytest +from allure_commons.lifecycle import AllureLifecycle from allure_commons.model2 import Label -from allure_commons.model2 import Status from allure_commons.model2 import Link - +from allure_commons.model2 import Status +from allure_commons.model2 import StatusDetails from allure_commons.types import LabelType -from allure_commons.utils import platform_label from allure_commons.utils import host_tag, thread_tag from allure_commons.utils import md5 -from .utils import get_uuid -from .utils import get_step_name -from .utils import get_status_details -from .utils import get_pytest_report_status -from allure_commons.model2 import StatusDetails -from functools import partial -from allure_commons.lifecycle import AllureLifecycle -from .utils import get_full_name, get_name, get_params +from allure_commons.utils import now +from allure_commons.utils import platform_label +from allure_commons.utils import uuid4 from .utils import allure_description, pytest_markers, allure_labels, allure_links, get_tags_from_environment_vars +from .utils import get_full_name, get_name, get_params +from .utils import get_pytest_report_status +from .utils import get_status_details +from .utils import get_step_name +from .utils import get_uuid + class PytestBDDListener: def __init__(self, config): @@ -36,7 +37,6 @@ def _scenario_finalizer(self, scenario): step_result.status = Status.SKIPPED self.lifecycle.stop_step(uuid=step_uuid) - @pytest.hookimpl def pytest_bdd_before_scenario(self, request, feature, scenario): uuid = get_uuid(request.node.nodeid) @@ -49,15 +49,18 @@ def pytest_bdd_before_scenario(self, request, feature, scenario): test_result.start = now() test_result.historyId = md5(request.node.nodeid) test_result.labels.extend([Label(name=name, value=value) for name, value in allure_labels(request.node)]) - test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in get_tags_from_environment_vars(self.config.option.env_vars_to_tag)]) - test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in pytest_markers(request.node)]) + test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in + get_tags_from_environment_vars(self.config.option.env_vars_to_tag)]) + test_result.labels.extend( + [Label(name=LabelType.TAG, value=value) for value in pytest_markers(request.node)]) test_result.labels.append(Label(name=LabelType.HOST, value=self.host)) test_result.labels.append(Label(name=LabelType.THREAD, value=self.thread)) test_result.labels.append(Label(name=LabelType.FRAMEWORK, value="pytest-bdd")) test_result.labels.append(Label(name=LabelType.LANGUAGE, value=platform_label())) test_result.labels.append(Label(name=LabelType.FEATURE, value=feature.name)) test_result.description = allure_description(request.node) - test_result.links.extend([Link(link_type, url, name) for link_type, url, name in allure_links(request.node)]) + test_result.links.extend( + [Link(link_type, url, name) for link_type, url, name in allure_links(request.node)]) test_result.parameters = get_params(request.node) finalizer = partial(self._scenario_finalizer, scenario) @@ -68,7 +71,8 @@ def pytest_bdd_after_scenario(self, request, feature, scenario): uuid = get_uuid(request.node.nodeid) with self.lifecycle.update_test_case(uuid=uuid) as test_result: test_result.stop = now() - test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in get_tags_from_environment_vars(self.config.option.env_vars_to_tag)]) + test_result.labels.extend([Label(name=LabelType.TAG, value=value) for value in + get_tags_from_environment_vars(self.config.option.env_vars_to_tag)]) @pytest.hookimpl def pytest_bdd_before_step(self, request, feature, scenario, step, step_func): diff --git a/allure-pytest-bdd/src/utils.py b/allure-pytest-bdd/src/utils.py index b5df408a..e75dc1e8 100644 --- a/allure-pytest-bdd/src/utils.py +++ b/allure-pytest-bdd/src/utils.py @@ -1,12 +1,13 @@ import os from uuid import UUID -from allure_commons.utils import md5 -from allure_commons.utils import represent -from allure_commons.model2 import StatusDetails -from allure_commons.model2 import Status + from allure_commons.model2 import Parameter -from allure_commons.utils import format_exception +from allure_commons.model2 import Status +from allure_commons.model2 import StatusDetails from allure_commons.types import LabelType +from allure_commons.utils import format_exception +from allure_commons.utils import md5 +from allure_commons.utils import represent ALLURE_DESCRIPTION_MARK = 'allure_description' ALLURE_DESCRIPTION_HTML_MARK = 'allure_description_html' @@ -21,6 +22,7 @@ LabelType.SUB_SUITE ] + def get_step_name(node, step): name = "{step_keyword} {step_name}".format(step_keyword=step.keyword, step_name=step.name) if hasattr(node, 'callspec'): @@ -125,6 +127,7 @@ def allure_links(item): for mark in item.iter_markers(name=ALLURE_LINK_MARK): yield (mark.kwargs["link_type"], mark.args[0], mark.kwargs["name"]) + def get_tags_from_environment_vars(env_vars_list): tags = set() for var_name in env_vars_list.split(','): From 92aa3a7911abe405e5e2e828ddd943d2e0e09828 Mon Sep 17 00:00:00 2001 From: "gil.becker" Date: Mon, 10 Apr 2023 17:04:25 +0300 Subject: [PATCH 09/12] Invalid version: '2.8.32-eliram01282021' remove --- allure-pytest-bdd/setup.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/allure-pytest-bdd/setup.py b/allure-pytest-bdd/setup.py index 69dd716e..a77de6e5 100644 --- a/allure-pytest-bdd/setup.py +++ b/allure-pytest-bdd/setup.py @@ -19,9 +19,9 @@ 'Programming Language :: Python :: 3.11', ] -# setup_requires = [ - # "setuptools_scm" -# ] +setup_requires = [ + "setuptools_scm" +] install_requires = [ "pytest>=4.5.0", @@ -31,13 +31,13 @@ ] -# def prepare_version(): -# # from setuptools_scm import get_version -# # configuration = {"root": "..", "relative_to": __file__} -# # version = get_version(**configuration) -# # install_requires.append(f"allure-python-commons=={version}") -# install_requires.append("allure-python-commons==2.8.32") -# # return configuration +def prepare_version(): + from setuptools_scm import get_version + configuration = {"root": "..", "relative_to": __file__} + version = get_version(**configuration) + install_requires.append(f"allure-python-commons=={version}") + install_requires.append("allure-python-commons==2.8.32") + return configuration def get_readme(fname): @@ -47,8 +47,7 @@ def get_readme(fname): def main(): setup( name=PACKAGE, - version="2.8.32-eliram01282021", - # use_scm_version=prepare_version, + use_scm_version=prepare_version, description="Allure pytest-bdd integration", url="https://github.com/allure-framework/allure-python", author="QAMetaSoftware, Stanislav Seliverstov", @@ -60,7 +59,7 @@ def main(): packages=["allure_pytest_bdd"], package_dir={"allure_pytest_bdd": "src"}, entry_points={"pytest11": ["allure_pytest_bdd = allure_pytest_bdd.plugin"]}, - # setup_requires=setup_requires, + setup_requires=setup_requires, install_requires=install_requires ) From aa4e9557ceb62d893a3c5f4330542a512758c31f Mon Sep 17 00:00:00 2001 From: "gil.becker" Date: Mon, 10 Apr 2023 17:10:02 +0300 Subject: [PATCH 10/12] fix allure-python-commons ver conflict --- allure-pytest-bdd/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allure-pytest-bdd/setup.py b/allure-pytest-bdd/setup.py index a77de6e5..987c90fd 100644 --- a/allure-pytest-bdd/setup.py +++ b/allure-pytest-bdd/setup.py @@ -36,7 +36,7 @@ def prepare_version(): configuration = {"root": "..", "relative_to": __file__} version = get_version(**configuration) install_requires.append(f"allure-python-commons=={version}") - install_requires.append("allure-python-commons==2.8.32") + install_requires.append("allure-python-commons==2.9.43") return configuration From bf556db85ce77c5777b9321b4b525096ed30f985 Mon Sep 17 00:00:00 2001 From: "gil.becker" Date: Mon, 10 Apr 2023 17:16:18 +0300 Subject: [PATCH 11/12] fix allure-python-commons ver conflict --- allure-pytest-bdd/setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/allure-pytest-bdd/setup.py b/allure-pytest-bdd/setup.py index 987c90fd..03ede3fd 100644 --- a/allure-pytest-bdd/setup.py +++ b/allure-pytest-bdd/setup.py @@ -36,7 +36,6 @@ def prepare_version(): configuration = {"root": "..", "relative_to": __file__} version = get_version(**configuration) install_requires.append(f"allure-python-commons=={version}") - install_requires.append("allure-python-commons==2.9.43") return configuration From 263eca508aee12d27159a5d190c576736e50df29 Mon Sep 17 00:00:00 2001 From: "gil.becker" Date: Mon, 10 Apr 2023 17:19:23 +0300 Subject: [PATCH 12/12] fix allure-python-commons ver conflict --- allure-pytest-bdd/setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/allure-pytest-bdd/setup.py b/allure-pytest-bdd/setup.py index 03ede3fd..9ec559e5 100644 --- a/allure-pytest-bdd/setup.py +++ b/allure-pytest-bdd/setup.py @@ -26,8 +26,7 @@ install_requires = [ "pytest>=4.5.0", "pytest-bdd>=3.0.0", - "six>=1.9.0", - "allure-python-commons==2.9.43", + "six>=1.9.0" ]