Skip to content

Pytest Mode Handler

Class FauxpyPytestModeHandler is responsible for managing Pytest Mode. Details of this class are provided below.

FauxpyPytestModeHandler

Handles Pytest Mode by interacting with Pytest through various hooks.

Source code in fauxpy/command_line/pytest_mode/handler.py
 13
 14
 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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
class FauxpyPytestModeHandler:
    """
    Handles Pytest Mode by interacting with Pytest through various hooks.
    """

    def __init__(self):
        self._session_timer = Timer()
        self._pytest_option_manager = PytestOptionManager()
        self._fauxpy_session_type = FauxpySessionType.FauxpyNotCalled
        self._session_object: Optional[FlSession] = None
        self._session_file_manager = None

    def add_option(self, pytest_parser):
        """
        Adds FauxPy-specific command-line options to the pytest parser.

        Args:
            pytest_parser: The Pytest parser object to which FauxPy options should be added.
        """
        self._pytest_option_manager.add_fauxpy_options(pytest_parser)

    def configure(self, pytest_config):
        """
        Configures the FauxPy session.

        Args:
            pytest_config: The Pytest configuration object used to determine the session type
            and options.
        """
        self._fauxpy_session_type = self._pytest_option_manager.get_fauxpy_session_type(
            pytest_config
        )
        if self._fauxpy_session_type == FauxpySessionType.FaultLocalization:
            self._session_timer.start()

            fl_option_manager = self._pytest_option_manager.get_fl_option_manager(
                pytest_config
            )

            self._session_object = fl_option_manager.get_fl_session()
            self._session_file_manager = fl_option_manager.get_session_file_manager()

            logging.basicConfig(
                filename=self._session_file_manager.get_log_file_path(),
                level=logging.DEBUG,
                format="%(asctime)s %(message)s",
                filemode="w",
            )

            if isinstance(self._session_object, FlFamilySession):
                self._session_file_manager.save_config_to_file(
                    target_src=fl_option_manager.get_target_src(),
                    exclude_list=fl_option_manager.get_exclude_list(),
                    fl_family=fl_option_manager.get_fl_family(),
                    fl_granularity=fl_option_manager.get_fl_granularity(),
                    top_n=fl_option_manager.get_top_n(),
                    targeted_failing_test_list=fl_option_manager.get_targeted_failing_test_list(),
                    mutation_strategy=fl_option_manager.get_mutation_strategy()
                )

    def runtest_call(self, item):
        """
        Handles the test call event during test execution.

        Args:
            item: The pytest item representing the test being executed.
        """
        if self._fauxpy_session_type == FauxpySessionType.FaultLocalization:
            self._session_object.run_test_call(item)

    def runtest_make_report(self, item, call):
        """
        Gathers the test results and generates reports after a test call is executed.

        Args:
            item: The Pytest item representing the test that was executed.
            call: The Pytest call object containing the results of the test (setup, call, teardown).
        """
        if self._fauxpy_session_type == FauxpySessionType.FaultLocalization:
            self._session_object.run_test_make_report(item, call)

    def terminal_summary(self, terminal_reporter, exitstatus):
        """
        Generates final results after all tests have completed.

        Args:
            terminal_reporter: The Pytest terminal reporter object used for output.
            exitstatus: The exit status of Pytest, indicating success or failure.
        """
        if self._fauxpy_session_type == FauxpySessionType.FaultLocalization:
            banner_start = (
                "***************************************************\n"
                "                FauxPy Started!                    \n"
                "***************************************************\n"
            )
            print("\n")
            print(banner_start)

            fl_print.normal(f"Running {self._session_object}")

            if (isinstance(self._session_object, FlFamilySession) and
                    len(self._session_object.get_targeted_failing_test_list()) > 0):
                fl_print.normal("Targeted failing tests:")
                for index, item in enumerate(self._session_object.get_targeted_failing_test_list()):
                    fl_print.normal(f"  {index + 1}. {item}")

            print("\n")
            banner_dynamic_analysis = (
                               "==============================\n"
                               " Dynamic Analysis in Progress \n"
                               "==============================\n"
            )
            print(banner_dynamic_analysis)

            score_entity_list = self._session_object.terminal_summary(
                terminal_reporter, exitstatus
            )

            print("\n")
            print("--- Dynamic Analysis Complete ---")

            session_time = self._session_timer.end()
            self._session_file_manager.save_delta_time_to_file(session_time)

            for technique, score_list in score_entity_list.items():
                self._session_file_manager.save_scores_to_file(technique, score_list)

            if isinstance(self._session_object, FlFamilySession):
                fl_session_report = FlSessionReport(
                    score_entity_list,
                    session_time,
                    self._session_object.get_fl_granularity(),
                    self._session_object.get_project_working_directory()
                )
                report_string = fl_session_report.generate_report()
                print(report_string)

            banner_end = (
                "**************************************************\n"
                "                FauxPy Ended!                     \n"
                "**************************************************\n"
            )
            print(banner_end)

add_option(pytest_parser)

Adds FauxPy-specific command-line options to the pytest parser.

Parameters:

Name Type Description Default
pytest_parser

The Pytest parser object to which FauxPy options should be added.

required
Source code in fauxpy/command_line/pytest_mode/handler.py
25
26
27
28
29
30
31
32
def add_option(self, pytest_parser):
    """
    Adds FauxPy-specific command-line options to the pytest parser.

    Args:
        pytest_parser: The Pytest parser object to which FauxPy options should be added.
    """
    self._pytest_option_manager.add_fauxpy_options(pytest_parser)

configure(pytest_config)

Configures the FauxPy session.

Parameters:

Name Type Description Default
pytest_config

The Pytest configuration object used to determine the session type

required
Source code in fauxpy/command_line/pytest_mode/handler.py
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
def configure(self, pytest_config):
    """
    Configures the FauxPy session.

    Args:
        pytest_config: The Pytest configuration object used to determine the session type
        and options.
    """
    self._fauxpy_session_type = self._pytest_option_manager.get_fauxpy_session_type(
        pytest_config
    )
    if self._fauxpy_session_type == FauxpySessionType.FaultLocalization:
        self._session_timer.start()

        fl_option_manager = self._pytest_option_manager.get_fl_option_manager(
            pytest_config
        )

        self._session_object = fl_option_manager.get_fl_session()
        self._session_file_manager = fl_option_manager.get_session_file_manager()

        logging.basicConfig(
            filename=self._session_file_manager.get_log_file_path(),
            level=logging.DEBUG,
            format="%(asctime)s %(message)s",
            filemode="w",
        )

        if isinstance(self._session_object, FlFamilySession):
            self._session_file_manager.save_config_to_file(
                target_src=fl_option_manager.get_target_src(),
                exclude_list=fl_option_manager.get_exclude_list(),
                fl_family=fl_option_manager.get_fl_family(),
                fl_granularity=fl_option_manager.get_fl_granularity(),
                top_n=fl_option_manager.get_top_n(),
                targeted_failing_test_list=fl_option_manager.get_targeted_failing_test_list(),
                mutation_strategy=fl_option_manager.get_mutation_strategy()
            )

runtest_call(item)

Handles the test call event during test execution.

Parameters:

Name Type Description Default
item

The pytest item representing the test being executed.

required
Source code in fauxpy/command_line/pytest_mode/handler.py
73
74
75
76
77
78
79
80
81
def runtest_call(self, item):
    """
    Handles the test call event during test execution.

    Args:
        item: The pytest item representing the test being executed.
    """
    if self._fauxpy_session_type == FauxpySessionType.FaultLocalization:
        self._session_object.run_test_call(item)

runtest_make_report(item, call)

Gathers the test results and generates reports after a test call is executed.

Parameters:

Name Type Description Default
item

The Pytest item representing the test that was executed.

required
call

The Pytest call object containing the results of the test (setup, call, teardown).

required
Source code in fauxpy/command_line/pytest_mode/handler.py
83
84
85
86
87
88
89
90
91
92
def runtest_make_report(self, item, call):
    """
    Gathers the test results and generates reports after a test call is executed.

    Args:
        item: The Pytest item representing the test that was executed.
        call: The Pytest call object containing the results of the test (setup, call, teardown).
    """
    if self._fauxpy_session_type == FauxpySessionType.FaultLocalization:
        self._session_object.run_test_make_report(item, call)

terminal_summary(terminal_reporter, exitstatus)

Generates final results after all tests have completed.

Parameters:

Name Type Description Default
terminal_reporter

The Pytest terminal reporter object used for output.

required
exitstatus

The exit status of Pytest, indicating success or failure.

required
Source code in fauxpy/command_line/pytest_mode/handler.py
 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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
def terminal_summary(self, terminal_reporter, exitstatus):
    """
    Generates final results after all tests have completed.

    Args:
        terminal_reporter: The Pytest terminal reporter object used for output.
        exitstatus: The exit status of Pytest, indicating success or failure.
    """
    if self._fauxpy_session_type == FauxpySessionType.FaultLocalization:
        banner_start = (
            "***************************************************\n"
            "                FauxPy Started!                    \n"
            "***************************************************\n"
        )
        print("\n")
        print(banner_start)

        fl_print.normal(f"Running {self._session_object}")

        if (isinstance(self._session_object, FlFamilySession) and
                len(self._session_object.get_targeted_failing_test_list()) > 0):
            fl_print.normal("Targeted failing tests:")
            for index, item in enumerate(self._session_object.get_targeted_failing_test_list()):
                fl_print.normal(f"  {index + 1}. {item}")

        print("\n")
        banner_dynamic_analysis = (
                           "==============================\n"
                           " Dynamic Analysis in Progress \n"
                           "==============================\n"
        )
        print(banner_dynamic_analysis)

        score_entity_list = self._session_object.terminal_summary(
            terminal_reporter, exitstatus
        )

        print("\n")
        print("--- Dynamic Analysis Complete ---")

        session_time = self._session_timer.end()
        self._session_file_manager.save_delta_time_to_file(session_time)

        for technique, score_list in score_entity_list.items():
            self._session_file_manager.save_scores_to_file(technique, score_list)

        if isinstance(self._session_object, FlFamilySession):
            fl_session_report = FlSessionReport(
                score_entity_list,
                session_time,
                self._session_object.get_fl_granularity(),
                self._session_object.get_project_working_directory()
            )
            report_string = fl_session_report.generate_report()
            print(report_string)

        banner_end = (
            "**************************************************\n"
            "                FauxPy Ended!                     \n"
            "**************************************************\n"
        )
        print(banner_end)