From 2446c401d9ec3fff770ec9ba40b604210a5ea0c0 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Mon, 15 Apr 2024 13:54:45 +0200 Subject: [PATCH] test: unit tests moved to separate folder; scope of autouse bec_dispatcher fixture reduced only for unit tests; ci adjusted --- .gitlab-ci.yml | 4 +-- bec_widgets/utils/bec_dispatcher.py | 3 +- tests/conftest.py | 36 ------------------- tests/end-2-end/test_bec_figure_rpc.py | 26 +++++++------- tests/{test_msgs => unit_tests}/__init__.py | 0 tests/{ => unit_tests}/client_mocks.py | 0 tests/unit_tests/conftest.py | 14 ++++++++ tests/{ => unit_tests}/test_bec_connector.py | 0 tests/{ => unit_tests}/test_bec_dispatcher.py | 0 tests/{ => unit_tests}/test_bec_figure.py | 0 tests/{ => unit_tests}/test_bec_monitor.py | 0 tests/{ => unit_tests}/test_bec_motor_map.py | 0 tests/{ => unit_tests}/test_config_dialog.py | 0 .../test_configs/config_device.yaml | 0 .../test_configs/config_device_no_entry.yaml | 0 .../test_configs/config_scan.yaml | 0 tests/{ => unit_tests}/test_crosshair.py | 0 tests/{ => unit_tests}/test_editor.py | 0 tests/{ => unit_tests}/test_eiger_plot.py | 0 .../test_generate_cli_client.py | 0 tests/{ => unit_tests}/test_motor_control.py | 0 tests/{ => unit_tests}/test_motor_map.py | 0 tests/unit_tests/test_msgs/__init__.py | 0 .../test_msgs/available_scans_message.py | 0 tests/{ => unit_tests}/test_plot_base.py | 0 tests/{ => unit_tests}/test_scan_control.py | 4 +-- tests/{ => unit_tests}/test_stream_plot.py | 0 .../{ => unit_tests}/test_validator_errors.py | 0 tests/{ => unit_tests}/test_waveform1d.py | 0 tests/{ => unit_tests}/test_widget_io.py | 0 tests/{ => unit_tests}/test_yaml_dialog.py | 0 31 files changed, 33 insertions(+), 54 deletions(-) delete mode 100644 tests/conftest.py rename tests/{test_msgs => unit_tests}/__init__.py (100%) rename tests/{ => unit_tests}/client_mocks.py (100%) create mode 100644 tests/unit_tests/conftest.py rename tests/{ => unit_tests}/test_bec_connector.py (100%) rename tests/{ => unit_tests}/test_bec_dispatcher.py (100%) rename tests/{ => unit_tests}/test_bec_figure.py (100%) rename tests/{ => unit_tests}/test_bec_monitor.py (100%) rename tests/{ => unit_tests}/test_bec_motor_map.py (100%) rename tests/{ => unit_tests}/test_config_dialog.py (100%) rename tests/{ => unit_tests}/test_configs/config_device.yaml (100%) rename tests/{ => unit_tests}/test_configs/config_device_no_entry.yaml (100%) rename tests/{ => unit_tests}/test_configs/config_scan.yaml (100%) rename tests/{ => unit_tests}/test_crosshair.py (100%) rename tests/{ => unit_tests}/test_editor.py (100%) rename tests/{ => unit_tests}/test_eiger_plot.py (100%) rename tests/{ => unit_tests}/test_generate_cli_client.py (100%) rename tests/{ => unit_tests}/test_motor_control.py (100%) rename tests/{ => unit_tests}/test_motor_map.py (100%) create mode 100644 tests/unit_tests/test_msgs/__init__.py rename tests/{ => unit_tests}/test_msgs/available_scans_message.py (100%) rename tests/{ => unit_tests}/test_plot_base.py (100%) rename tests/{ => unit_tests}/test_scan_control.py (98%) rename tests/{ => unit_tests}/test_stream_plot.py (100%) rename tests/{ => unit_tests}/test_validator_errors.py (100%) rename tests/{ => unit_tests}/test_waveform1d.py (100%) rename tests/{ => unit_tests}/test_widget_io.py (100%) rename tests/{ => unit_tests}/test_yaml_dialog.py (100%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 59845ca8..d8c6774b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -88,6 +88,7 @@ tests: - apt-get install -y libgl1-mesa-glx libegl1-mesa x11-utils libxkbcommon-x11-0 libdbus-1-3 - pip install -e ./bec/bec_lib[dev] - pip install -e .[dev] + - cd ./test/unit_tests/ - coverage run --source=./bec_widgets -m pytest -v --junitxml=report.xml --random-order --full-trace ./tests - coverage report - coverage xml @@ -151,8 +152,7 @@ end-2-end-conda: - cd ../ - pip install -e .[dev] - cd ./tests/end-2-end - - redis-server --daemonize yes - - pytest --start-servers + - pytest --start-servers --flush-redis --random-order artifacts: when: on_failure diff --git a/bec_widgets/utils/bec_dispatcher.py b/bec_widgets/utils/bec_dispatcher.py index 774d6607..6a9b64bf 100644 --- a/bec_widgets/utils/bec_dispatcher.py +++ b/bec_widgets/utils/bec_dispatcher.py @@ -82,8 +82,9 @@ class BECDispatcher: return self._slots = collections.defaultdict(set) + self.client = client - if client is None: + if self.client is None: self.client = BECClient(connector_cls=QtRedisConnector, forced=True) else: if self.client.started: diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index 75009fee..00000000 --- a/tests/conftest.py +++ /dev/null @@ -1,36 +0,0 @@ -import threading - -import pytest -from bec_lib.bec_service import BECService - -from bec_widgets.utils import bec_dispatcher as bec_dispatcher_module - - -@pytest.fixture() -def threads_check(): - current_threads = set( - th - for th in threading.enumerate() - if "loguru" not in th.name and th is not threading.main_thread() - ) - yield - threads_after = set( - th - for th in threading.enumerate() - if "loguru" not in th.name and th is not threading.main_thread() - ) - additional_threads = threads_after - current_threads - assert ( - len(additional_threads) == 0 - ), f"Test creates {len(additional_threads)} threads that are not cleaned: {additional_threads}" - - -@pytest.fixture(autouse=True) -def bec_dispatcher(threads_check): - bec_dispatcher = bec_dispatcher_module.BECDispatcher() - yield bec_dispatcher - bec_dispatcher.disconnect_all() - # clean BEC client - bec_dispatcher.client.shutdown() - # reinitialize singleton for next test - bec_dispatcher_module.BECDispatcher.reset_singleton() diff --git a/tests/end-2-end/test_bec_figure_rpc.py b/tests/end-2-end/test_bec_figure_rpc.py index 57ad0bd5..3eba96e1 100644 --- a/tests/end-2-end/test_bec_figure_rpc.py +++ b/tests/end-2-end/test_bec_figure_rpc.py @@ -7,14 +7,17 @@ from bec_widgets.widgets.plots.waveform import Signal, SignalData @pytest.fixture -def rpc_server(qtbot, bec_client_lib): +def rpc_server(qtbot, bec_client_lib, threads_check): dispatcher = BECDispatcher(client=bec_client_lib) # Has to init singleton with fixture client server = BECWidgetsCLIServer(gui_id="id_test") qtbot.addWidget(server.fig) qtbot.waitExposed(server.fig) qtbot.wait(1000) # 1s long to wait until gui is ready yield server + dispatcher.disconnect_all() server.client.shutdown() + server.shutdown() + dispatcher.reset_singleton() def test_rpc_waveform1d_custom_curve(rpc_server, qtbot): @@ -31,7 +34,7 @@ def test_rpc_waveform1d_custom_curve(rpc_server, qtbot): assert len(fig_server.widgets["widget_1"].curves) == 1 -def test_rpc_plotting_shortcuts(rpc_server, qtbot): +def test_rpc_plotting_shortcuts_operation(rpc_server, qtbot): fig = BECFigure(rpc_server.gui_id) fig_server = rpc_server.fig @@ -48,13 +51,12 @@ def test_rpc_plotting_shortcuts(rpc_server, qtbot): assert motor_map.__class__.__name__ == "BECMotorMap" assert motor_map.__class__ == BECMotorMap - # # check if the correct devices are set - # plt_curve_config = plt.curves[0].get_config() - # assert plt_curve_config["signals"] == { - # "source": "scan_segment", - # "x": {"name": "samx", "entry": "samx", "unit": None, "modifier": None, "limits": None}, - # "y": {"name": "bpm4i", "entry": "bpm4i", "unit": None, "modifier": None, "limits": None}, - # "z": None, - # } - # - # im_config = im.get_config() + # check if the correct devices are set + assert plt.config_dict["curves"]["bpm4i-bpm4i"]["signals"] == { + "source": "scan_segment", + "x": {"name": "samx", "entry": "samx", "unit": None, "modifier": None, "limits": None}, + "y": {"name": "bpm4i", "entry": "bpm4i", "unit": None, "modifier": None, "limits": None}, + "z": None, + } + + assert im.config_dict["images"]["eiger"]["monitor"] == "eiger" diff --git a/tests/test_msgs/__init__.py b/tests/unit_tests/__init__.py similarity index 100% rename from tests/test_msgs/__init__.py rename to tests/unit_tests/__init__.py diff --git a/tests/client_mocks.py b/tests/unit_tests/client_mocks.py similarity index 100% rename from tests/client_mocks.py rename to tests/unit_tests/client_mocks.py diff --git a/tests/unit_tests/conftest.py b/tests/unit_tests/conftest.py new file mode 100644 index 00000000..fc644108 --- /dev/null +++ b/tests/unit_tests/conftest.py @@ -0,0 +1,14 @@ +import pytest + +from bec_widgets.utils import bec_dispatcher as bec_dispatcher_module + + +@pytest.fixture(autouse=True) +def bec_dispatcher(threads_check): + bec_dispatcher = bec_dispatcher_module.BECDispatcher() + yield bec_dispatcher + bec_dispatcher.disconnect_all() + # clean BEC client + bec_dispatcher.client.shutdown() + # reinitialize singleton for next test + bec_dispatcher_module.BECDispatcher.reset_singleton() diff --git a/tests/test_bec_connector.py b/tests/unit_tests/test_bec_connector.py similarity index 100% rename from tests/test_bec_connector.py rename to tests/unit_tests/test_bec_connector.py diff --git a/tests/test_bec_dispatcher.py b/tests/unit_tests/test_bec_dispatcher.py similarity index 100% rename from tests/test_bec_dispatcher.py rename to tests/unit_tests/test_bec_dispatcher.py diff --git a/tests/test_bec_figure.py b/tests/unit_tests/test_bec_figure.py similarity index 100% rename from tests/test_bec_figure.py rename to tests/unit_tests/test_bec_figure.py diff --git a/tests/test_bec_monitor.py b/tests/unit_tests/test_bec_monitor.py similarity index 100% rename from tests/test_bec_monitor.py rename to tests/unit_tests/test_bec_monitor.py diff --git a/tests/test_bec_motor_map.py b/tests/unit_tests/test_bec_motor_map.py similarity index 100% rename from tests/test_bec_motor_map.py rename to tests/unit_tests/test_bec_motor_map.py diff --git a/tests/test_config_dialog.py b/tests/unit_tests/test_config_dialog.py similarity index 100% rename from tests/test_config_dialog.py rename to tests/unit_tests/test_config_dialog.py diff --git a/tests/test_configs/config_device.yaml b/tests/unit_tests/test_configs/config_device.yaml similarity index 100% rename from tests/test_configs/config_device.yaml rename to tests/unit_tests/test_configs/config_device.yaml diff --git a/tests/test_configs/config_device_no_entry.yaml b/tests/unit_tests/test_configs/config_device_no_entry.yaml similarity index 100% rename from tests/test_configs/config_device_no_entry.yaml rename to tests/unit_tests/test_configs/config_device_no_entry.yaml diff --git a/tests/test_configs/config_scan.yaml b/tests/unit_tests/test_configs/config_scan.yaml similarity index 100% rename from tests/test_configs/config_scan.yaml rename to tests/unit_tests/test_configs/config_scan.yaml diff --git a/tests/test_crosshair.py b/tests/unit_tests/test_crosshair.py similarity index 100% rename from tests/test_crosshair.py rename to tests/unit_tests/test_crosshair.py diff --git a/tests/test_editor.py b/tests/unit_tests/test_editor.py similarity index 100% rename from tests/test_editor.py rename to tests/unit_tests/test_editor.py diff --git a/tests/test_eiger_plot.py b/tests/unit_tests/test_eiger_plot.py similarity index 100% rename from tests/test_eiger_plot.py rename to tests/unit_tests/test_eiger_plot.py diff --git a/tests/test_generate_cli_client.py b/tests/unit_tests/test_generate_cli_client.py similarity index 100% rename from tests/test_generate_cli_client.py rename to tests/unit_tests/test_generate_cli_client.py diff --git a/tests/test_motor_control.py b/tests/unit_tests/test_motor_control.py similarity index 100% rename from tests/test_motor_control.py rename to tests/unit_tests/test_motor_control.py diff --git a/tests/test_motor_map.py b/tests/unit_tests/test_motor_map.py similarity index 100% rename from tests/test_motor_map.py rename to tests/unit_tests/test_motor_map.py diff --git a/tests/unit_tests/test_msgs/__init__.py b/tests/unit_tests/test_msgs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_msgs/available_scans_message.py b/tests/unit_tests/test_msgs/available_scans_message.py similarity index 100% rename from tests/test_msgs/available_scans_message.py rename to tests/unit_tests/test_msgs/available_scans_message.py diff --git a/tests/test_plot_base.py b/tests/unit_tests/test_plot_base.py similarity index 100% rename from tests/test_plot_base.py rename to tests/unit_tests/test_plot_base.py diff --git a/tests/test_scan_control.py b/tests/unit_tests/test_scan_control.py similarity index 98% rename from tests/test_scan_control.py rename to tests/unit_tests/test_scan_control.py index 92b4f3d6..d526a57d 100644 --- a/tests/test_scan_control.py +++ b/tests/unit_tests/test_scan_control.py @@ -1,6 +1,4 @@ # pylint: disable = no-name-in-module,missing-class-docstring, missing-module-docstring -import os -import pickle from unittest.mock import MagicMock import pytest @@ -9,7 +7,7 @@ from qtpy.QtWidgets import QLineEdit from bec_widgets.utils.widget_io import WidgetIO from bec_widgets.widgets import ScanControl -from .test_msgs.available_scans_message import available_scans_message +from tests.unit_tests.test_msgs.available_scans_message import available_scans_message class FakePositioner: diff --git a/tests/test_stream_plot.py b/tests/unit_tests/test_stream_plot.py similarity index 100% rename from tests/test_stream_plot.py rename to tests/unit_tests/test_stream_plot.py diff --git a/tests/test_validator_errors.py b/tests/unit_tests/test_validator_errors.py similarity index 100% rename from tests/test_validator_errors.py rename to tests/unit_tests/test_validator_errors.py diff --git a/tests/test_waveform1d.py b/tests/unit_tests/test_waveform1d.py similarity index 100% rename from tests/test_waveform1d.py rename to tests/unit_tests/test_waveform1d.py diff --git a/tests/test_widget_io.py b/tests/unit_tests/test_widget_io.py similarity index 100% rename from tests/test_widget_io.py rename to tests/unit_tests/test_widget_io.py diff --git a/tests/test_yaml_dialog.py b/tests/unit_tests/test_yaml_dialog.py similarity index 100% rename from tests/test_yaml_dialog.py rename to tests/unit_tests/test_yaml_dialog.py