Запуск одинаковых тестов для разных путей. 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, но единственное, что у меня получилось - вывод в консоль следующего текста:
При изучении тестовых логов я заметил, что тесты проходят только для первого пути, а второй путь, тесты не трогают. Посему прошу о помощи. Возможно ли реализовать запуск одинаковых тестов для нескольких путей? или же я хочу невозможного.