Запуск одинаковых тестов для разных путей. Unittest

У меня есть файл с тестами "test_connection.py", в котором собраны 4 теста для проверки подключения к программе с графическим интерфейсом. Вот сам код:

import json
import os
import sys
import unittest
from pathlib import Path
from queue import Queue
from unittest.mock import patch

from PyQt5.QtWidgets import QApplication
from fc.fc_image import FCImage

from communicator import async_communicator
from communicator.async_communicator import (
    AsyncConnector,
)
from communicator.locked_queue import LockedPriorityQueue
from widgets.main_window import MainWindow


async_communicator.DEFAULT_CONNECTIONS = Path(
    "tests", "testdata", "JsonRpcPipesConnector", "default_connections.json"
)
async_communicator.MAP_DEFAULT_CONNECTIONS = Path(
    "tests", "testdata", "JsonRpcPipesConnector", "default_map.json"
)

paths = [
    Path('C:/Users/akimov/Desktop/SmartForce-4.0/instances/C3SCIN-GC2-222248-V1_da99'),
    Path('C:/Users/akimov/Desktop/SmartForce-4.0/instances/C3SCIN-GC2-222251-V2_DA78'),
]


class TestConnection(unittest.TestCase):

    def check_pipe_names(self):
        with open(self.communicator._map_file_path) as map_file:
            map_data = json.load(map_file)
            self.assertTrue(
                self.communicator.output_pipe_name
                in map_data[0]["Socket"]["Attributes"]["Rx"]
            )
            self.assertTrue(
                self.communicator.input_pipe_name
                in map_data[0]["Socket"]["Attributes"]["Tx"]
            )

    def setUp(self):
        """
        Создание экземпляров окна и коммуникатора
        :return:
        """
        self.app = QApplication.instance() or QApplication(sys.argv)
        self.test_conf = paths[0].as_posix()
        settings_path = Path("Stored_state.ini").absolute()
        if settings_path.exists():
            os.remove(settings_path)
        response_queue = LockedPriorityQueue()
        request_queue = Queue()
        AsyncConnector.instance = None
        self.communicator = AsyncConnector(response_queue, request_queue)
        self.fc_image = FCImage()
        self.main_window = MainWindow(self.fc_image)
        self.main_window.open_project_signal.connect(
            self.communicator.get_data_from_ini
        )  # При изменении проекта любым способом он обновится и в Коммуникаторе

    def tearDown(self):
        settings_path = Path("Stored_state.ini")
        if settings_path.exists():
            os.remove(settings_path)
        if sys.platform != "win32":
            if (input_pipe := Path(self.communicator.input_pipe_name)).exists():
                os.remove(input_pipe)
            if (output_pipe := Path(self.communicator.output_pipe_name)).exists():
                os.remove(output_pipe)
        if (map_file := Path(self.communicator._map_file_path)).exists():
            os.remove(map_file)
        if (connection_file := Path(self.communicator._connection_file_path)).exists():
            os.remove(connection_file)

    def test_connection_no_project(self):
        """
        Проверяем генерацию необходимых файлов.
        При вызове SetUp они создаются автоматически.
        Поэтому необходимо очистить данные и вызвать выполнение функции снова
        """
        self.assertTrue(self.communicator._map_file_path.exists())
        self.assertTrue(self.communicator._connection_file_path.exists())
        with open(async_communicator.MAP_DEFAULT_CONNECTIONS) as default_map_file:
            default_map_data = json.load(default_map_file)
        with open(self.communicator._map_file_path, "r") as map_file:
            map_data = json.load(map_file)
        with open(async_communicator.DEFAULT_CONNECTIONS) as default_connection_file:
            default_connection_data = json.load(default_connection_file)
        with open(self.communicator._connection_file_path, "r") as connection_file:
            connection_data = json.load(connection_file)
        self.assertEqual(map_data, default_map_data)
        self.assertEqual(connection_data, default_connection_data)

    @patch("communicator.async_communicator.AsyncConnector.restart")
    @patch("PyQt5.QtWidgets.QMessageBox.critical")
    @patch("PyQt5.QtWidgets.QFileDialog.getExistingDirectory")
    def test_open_project(
        self, get_existing_project_mock, get_file_name_mock, restart_mock
    ):
        """
        Проверяем, что файл подменяется при изменении проекта
        """

        get_existing_project_mock.return_value = self.test_conf

        config = configparser.ConfigParser()
        config.read(Path(self.test_conf, "config.ini"))

        # Получение значения опции
        value = config.get("Files", "graph")

        get_file_name_mock.return_value = False
        self.main_window.openProject()
        with open(self.communicator._map_file_path, "r") as map_file:
            map_data = json.load(map_file)
            graph_path = map_data[0]["Configuration"]

            self.assertEqual(
                Path(graph_path).absolute(), Path(self.test_conf, value).absolute()
            )
        self.check_pipe_names()
        get_file_name_mock.assert_called_once()
        restart_mock.assert_called_once()

    @patch("PyQt5.QtWidgets.QFileDialog.getExistingDirectory")
    @patch("communicator.async_communicator.AsyncConnector.restart")
    @patch("PyQt5.QtWidgets.QMessageBox.critical")
    @patch("PyQt5.QtWidgets.QFileDialog.getExistingDirectory")
    def test_with_project(
        self,
        get_existing_project_mock,
        get_file_name_mock,
        restart_mock,
        get_directory_mock,
    ):
        """
        Проверка генерации файлов подключения при перезапуске ПО ПЧ
        """
        get_directory_mock.return_value = Path(self.test_conf).absolute()
        self.main_window.openProject()

        self.main_window.close()
        self.fc_image = FCImage()
        self.main_window = MainWindow(self.fc_image)
        self.main_window.open_project_signal.connect(
            self.communicator.get_data_from_ini
        )
        self.main_window.load_settings()

        config = configparser.ConfigParser()
        config.read(Path(self.test_conf, "config.ini"))

        # Получение значения опции
        value = config.get("Files", "graph")

        with open(self.communicator._map_file_path, "r") as map_file:
            map_data = json.load(map_file)
            graph_path = map_data[0]["Configuration"]

            self.assertEqual(
                Path(graph_path).absolute(), Path(self.test_conf, value).absolute()
            )
        get_existing_project_mock.assert_not_called()
        self.assertEqual(get_file_name_mock.call_count, 1)
        self.assertEqual(restart_mock.call_count, 1)

    @patch("communicator.async_communicator.AsyncConnector.restart")
    def test_connection_params_changed(
        self,
        restart_mock,
    ):
        """
        Проверка изменений параметров подключения
        """
        with open(self.communicator._connection_file_path) as connection_file:
            connection_data = json.load(connection_file)
            self.assertNotEqual(
                connection_data[0]["Property"]["Attributes"]["Port"], "another_port"
            )
        connection_type, connection_params = self.communicator.get_connection_params()
        connection_params["port"] = "another_port"
        connection_params["baud_rate"] = 4321
        connection_params["timeout"] = 321
        os.remove(self.communicator._connection_file_path)
        self.communicator.set_connection_params(connection_type, connection_params)
        self.assertTrue(self.communicator._connection_file_path.exists())
        with open(self.communicator._connection_file_path) as connection_file:
            connection_data = json.load(connection_file)
            self.assertEqual(connection_data[0]["Property"]["Type"], "PTN")
            self.assertEqual(
                connection_data[0]["Property"]["Attributes"]["BaudRate"], 4321
            )
            self.assertEqual(
                connection_data[0]["Property"]["Attributes"]["Timeout"], 321
            )

            self.assertEqual(
                connection_data[0]["Property"]["Attributes"]["Port"], "another_port"
            )
        self.check_pipe_names()
        restart_mock.assert_called_once()

    @staticmethod
    def run_tests_for_paths():
        for path in paths:
            print(f"Running tests for path: {path}")
        return True


result = TestConnection.run_tests_for_paths()

if __name__ == "__main__":
    unittest.main()

В этом коде я попытался реализовать выполнение 4 тестов для двух путей из переменной "paths". А попытался я это реализовать в функции "run_tests_for_paths" через цикл for, но единственное, что у меня получилось - вывод в консоль следующего текста: введите сюда описание изображения

При изучении тестовых логов я заметил, что тесты проходят только для первого пути, а второй путь, тесты не трогают. Посему прошу о помощи. Возможно ли реализовать запуск одинаковых тестов для нескольких путей? или же я хочу невозможного.


Ответы (0 шт):