Skip to content

pytest_run_test_setup

This module contains the PytestRunTestSetup class which is used to handle the setup of a test run in Pytest.

It includes methods to initialize the class and run the setup.

PytestRunTestSetup

A class that handles the setup of a test run in Pytest.

Attributes:

Name Type Description
item_ Item

The pytest item object.

logger Logger

The logger object.

item_attribute_accessor ItemAttributeAccessor

An attribute accessor for the item.

session_store SessionStore

The session store object.

Methods:

Name Description
__init__

Initializes the PytestRunTestSetup class.

run_setup

Runs the setup.

Source code in libs\cafex_core\src\cafex_core\utils\hooks_\pytest_run_test_setup.py
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
class PytestRunTestSetup:
    """A class that handles the setup of a test run in Pytest.

    Attributes:
        item_ (Item): The pytest item object.
        logger (Logger): The logger object.
        item_attribute_accessor (ItemAttributeAccessor): An attribute accessor for the item.
        session_store (SessionStore): The session store object.

    Methods:
        __init__: Initializes the PytestRunTestSetup class.
        run_setup: Runs the setup.
    """

    def __init__(self, item_):
        """Initialize the PytestRunTestSetup class.

        Args:
            item_: The pytest item object.
        """
        self.item_ = item_
        self.logger = CoreLogger(name=__name__).get_logger()
        self.item_attribute_accessor = None
        self.session_store = SessionStore()
        self.date_time_util = DateTimeActions()

    def run_setup(self):
        """Runs the setup.

        It logs the setup event, the node ID, the tags, and whether the
        item is a BDD scenario. It also updates the reporting attribute
        of the session store.
        """
        self.item_attribute_accessor = ItemAttributeAccessor(self.item_)

        test_name = self.item_.name
        node_id = self.item_.nodeid
        tags = list(self.item_attribute_accessor.tags)
        test_type = self.item_attribute_accessor.test_type
        self.logger.info(f"Running test : {test_name}")
        self.logger.info(f"Node Id : {node_id}")
        self.logger.info(f"tags : {tags}")
        self.logger.info(f"Test Type : {test_type}")

        # Set the current_test in the session store
        self.session_store.current_test = node_id

        # Initialize basic test data structure for all tests
        if node_id not in self.session_store.reporting["tests"]:
            test_data = {
                "name": test_name,
                "testType": test_type,
                "nodeId": node_id,
                "testStatus": "Not Executed",
                "startTime": self.date_time_util.get_current_date_time(),
                "endTime": None,
                "duration": None,
                "durationSeconds": None,
                "isDataDriven": False,
                "isOutline": False,
                "example": None,
                "tags": tags,
                "steps": [],
                "evidence": {"screenshots": [], "exceptions": [], "errorMessages": []},
            }

            if test_type == "pytest":
                is_parametrized = hasattr(self.item_, "callspec") and self.item_.callspec.params
                test_data.update(
                    {
                        "isDataDriven": True if is_parametrized else False,
                        "isOutline": False,  # Regular pytest tests are never outlines
                        "example": str(self.item_.callspec.params) if is_parametrized else None,
                    }
                )
            if test_type == "unittest":
                # Check if the test method uses subTest
                test_method = getattr(self.item_.cls, self.item_.name)
                if "self.subTest" in inspect.getsource(test_method):
                    test_data.update(
                        {
                            "isDataDriven": True,
                            "isOutline": False,
                            "example": "unittest with subTest",
                        }
                    )

            self.session_store.reporting["tests"][node_id] = test_data

        if hasattr(self.item_.function, "pytestmark"):
            for marker in self.item_.function.pytestmark:
                if marker.name == "ui_web" and not self.item_attribute_accessor.is_scenario:
                    from cafex_ui.web_client.ui_web_driver_initializer import (
                        WebDriverInitializer,
                    )

                    self.logger.info("Setting up web driver for non-BDD test.")
                    self.session_store.ui_scenario = True
                    WebDriverInitializer().initialize_driver()
                if marker.name == "mobile_app" and not self.item_attribute_accessor.is_scenario:
                    from cafex_ui.mobile_client.mobile_driver_initializer import (
                        MobileDriverInitializer,
                    )

                    self.logger.info("Setting up mobile driver for non-BDD test.")
                    self.session_store.mobile_ui_scenario = True
                    MobileDriverInitializer().initialize_driver()

__init__(item_)

Initialize the PytestRunTestSetup class.

Parameters:

Name Type Description Default
item_

The pytest item object.

required
Source code in libs\cafex_core\src\cafex_core\utils\hooks_\pytest_run_test_setup.py
29
30
31
32
33
34
35
36
37
38
39
def __init__(self, item_):
    """Initialize the PytestRunTestSetup class.

    Args:
        item_: The pytest item object.
    """
    self.item_ = item_
    self.logger = CoreLogger(name=__name__).get_logger()
    self.item_attribute_accessor = None
    self.session_store = SessionStore()
    self.date_time_util = DateTimeActions()

run_setup()

Runs the setup.

It logs the setup event, the node ID, the tags, and whether the item is a BDD scenario. It also updates the reporting attribute of the session store.

Source code in libs\cafex_core\src\cafex_core\utils\hooks_\pytest_run_test_setup.py
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
def run_setup(self):
    """Runs the setup.

    It logs the setup event, the node ID, the tags, and whether the
    item is a BDD scenario. It also updates the reporting attribute
    of the session store.
    """
    self.item_attribute_accessor = ItemAttributeAccessor(self.item_)

    test_name = self.item_.name
    node_id = self.item_.nodeid
    tags = list(self.item_attribute_accessor.tags)
    test_type = self.item_attribute_accessor.test_type
    self.logger.info(f"Running test : {test_name}")
    self.logger.info(f"Node Id : {node_id}")
    self.logger.info(f"tags : {tags}")
    self.logger.info(f"Test Type : {test_type}")

    # Set the current_test in the session store
    self.session_store.current_test = node_id

    # Initialize basic test data structure for all tests
    if node_id not in self.session_store.reporting["tests"]:
        test_data = {
            "name": test_name,
            "testType": test_type,
            "nodeId": node_id,
            "testStatus": "Not Executed",
            "startTime": self.date_time_util.get_current_date_time(),
            "endTime": None,
            "duration": None,
            "durationSeconds": None,
            "isDataDriven": False,
            "isOutline": False,
            "example": None,
            "tags": tags,
            "steps": [],
            "evidence": {"screenshots": [], "exceptions": [], "errorMessages": []},
        }

        if test_type == "pytest":
            is_parametrized = hasattr(self.item_, "callspec") and self.item_.callspec.params
            test_data.update(
                {
                    "isDataDriven": True if is_parametrized else False,
                    "isOutline": False,  # Regular pytest tests are never outlines
                    "example": str(self.item_.callspec.params) if is_parametrized else None,
                }
            )
        if test_type == "unittest":
            # Check if the test method uses subTest
            test_method = getattr(self.item_.cls, self.item_.name)
            if "self.subTest" in inspect.getsource(test_method):
                test_data.update(
                    {
                        "isDataDriven": True,
                        "isOutline": False,
                        "example": "unittest with subTest",
                    }
                )

        self.session_store.reporting["tests"][node_id] = test_data

    if hasattr(self.item_.function, "pytestmark"):
        for marker in self.item_.function.pytestmark:
            if marker.name == "ui_web" and not self.item_attribute_accessor.is_scenario:
                from cafex_ui.web_client.ui_web_driver_initializer import (
                    WebDriverInitializer,
                )

                self.logger.info("Setting up web driver for non-BDD test.")
                self.session_store.ui_scenario = True
                WebDriverInitializer().initialize_driver()
            if marker.name == "mobile_app" and not self.item_attribute_accessor.is_scenario:
                from cafex_ui.mobile_client.mobile_driver_initializer import (
                    MobileDriverInitializer,
                )

                self.logger.info("Setting up mobile driver for non-BDD test.")
                self.session_store.mobile_ui_scenario = True
                MobileDriverInitializer().initialize_driver()