Skip to content

Failing GUI tests in GitHub Actions #87

@a-niem

Description

@a-niem

Description
During automated testing of RodTracker the tests for user interactions with the GUI/whole program fail.
This was not observed when testing locally. So far I was also unable to reproduce it.

List of failed tests:

FAILED tests/test_userinteraction/test_usecases.py::test_typical - AssertionError
FAILED tests/test_userinteraction/test_usecases.py::test_open_rod_after_changes - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_usecases.py::test_undo_after_save - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_usecases.py::test_save_on_unloaded_img - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_position_operations[create rod] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_position_operations[delete rod] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_position_operations[change position] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_number_changing[switch number-abort] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_number_changing[switch number-all] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_number_changing[switch number-one cam] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_number_changing[switch number-one frame] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_number_changing[switch number-this frame/cam] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_length_adjustment[Lengthen-single] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_length_adjustment[Shorten-single] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_length_adjustment[Lengthen-all] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_length_adjustment[Shorten-all] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_display_operations[switch color] - TypeError: 'NoneType' object is not subscriptable
FAILED tests/test_userinteraction/test_useractions.py::test_amendment_operations[undo] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendment_operations[redo] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[undo-CreateRod(25)] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[undo-DeleteRod(12)] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[undo-ChangeRodPosition(12)] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[undo-SwitchRodNumber(12->7)1] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[undo-SwitchRodNumber(12->7)2] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[undo-SwitchRodNumber(12->7)3] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[undo-SwitchRodNumber(12->7)4] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[redo-CreateRod(25)] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[redo-DeleteRod(12)] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[redo-ChangeRodPosition(12)] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[redo-SwitchRodNumber(12->7)1] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[redo-SwitchRodNumber(12->7)2] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[redo-SwitchRodNumber(12->7)3] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_amendmendable_operations[redo-SwitchRodNumber(12->7)4] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-CreateRod(25)] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-DeleteRod(12)] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-ChangeRodPosition(12)] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-SwitchRodNumber(12->7)0] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-SwitchRodNumber(12->7)1] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-SwitchRodNumber(12->7)2] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-SwitchRodNumber(12->7)3] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-SwitchRodNumber(12->7)4] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-LengthAdjustment(12)0] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-LengthAdjustment(12)1] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-LengthAdjustment(12)2] - TypeError: 'NoneType' object is not iterable
FAILED tests/test_userinteraction/test_useractions.py::test_savable_operations[save-LengthAdjustment(12)3] - TypeError: 'NoneType' object is not iterable

Logs
There appear to be at least 2 failure modes:

  1.  tests/test_userinteraction/test_useractions.py:325: 
     _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
     
     self = <gui_actions.LengthAdjustment object at 0x7f702c8f4700>
     main_window = <RodTracker.ui.mainwindow.RodTrackWindow object at 0x7f702c4a4670>
     qtbot = <pytestqt.qtbot.QtBot object at 0x7f702c3f71c0>
     monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f6f3bfd6e20>
     tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/test_savable_operations_save_L3')
     
         def run(
             self,
             main_window: RodTrackWindow,
             qtbot: QtBot,
             monkeypatch: MonkeyPatch = None,
             tmp_path: pathlib.Path = None,
         ) -> RodTrackWindow:
             if self.assertions:
                 state = aa.pre_length_adjustment(main_window)
             if self.rod is not None:
                 cam_idx = main_window.ui.camera_tabs.currentIndex()
                 cam = main_window.cameras[cam_idx]
                 rods = cam.rods
     >           for rod in rods:
     E           TypeError: 'NoneType' object is not iterable
     
     tests/gui_actions.py:537: TypeError
     ------------------------------ Captured log setup ------------------------------
     INFO     RodTracker.ui.loggerwidget:loggerwidget.py:63 /home/runner/.local/share/RodTracker/Session_ngdlf7lh
     INFO     RodTracker.ui.loggerwidget:loggerwidget.py:139 (camera_0) (gp3) 25 image file(s) loaded from: /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/RodTracker/resources/example_data/images/gp3
     INFO     RodTracker.ui.loggerwidget:loggerwidget.py:139 (camera_1) (gp4) 25 image file(s) loaded from: /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/RodTracker/resources/example_data/images/gp4
     INFO     RodTracker.ui.loggerwidget:loggerwidget.py:139 (RodData) Loaded rod file(s) from: /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/RodTracker/resources/example_data/csv
    
  1.   _________________________________ test_typical _________________________________
     
     main_window = <RodTracker.ui.mainwindow.RodTrackWindow object at 0x7f702c9a3ca0>
     qtbot = <pytestqt.qtbot.QtBot object at 0x7f702c4c7fd0>
     monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f702c374070>
     tmp_path = PosixPath('/tmp/pytest-of-runner/pytest-0/test_typical0')
     
         @pytest.mark.filterwarnings("ignore:")
         def test_typical(
             main_window: RodTrackWindow,
             qtbot: QtBot,
             monkeypatch: MonkeyPatch,
             tmp_path: pathlib.Path,
         ):
             """Attempt a typical workflow."""
             try:
                 scenario = [
                     ga.OpenData(conftest.csv_data),
                     ga.OpenImage(conftest.cam1_img1),
                     ga.SwitchCamera(),
                     ga.OpenImage(conftest.cam2_img1),
                     ga.SwitchRodNumber(12, 7, lg.NumberChangeActions.ALL_ONE_CAM),
                     ga.SwitchCamera(),
                     ga.SwitchRodNumber(7, 12, lg.NumberChangeActions.CURRENT),
                     ga.SwitchFrame(1),
                     ga.SwitchFrame(1),
                     ga.ChangeRodPosition(12),
                     ga.CreateRod(25),
                     ga.SwitchCamera(),
                     ga.LengthAdjustment(QtCore.Qt.Key_T),
                     ga.SwitchColor("blue"),
                     ga.DeleteRod(12),
                     ga.SaveChanges(),
                 ]
                 for action in scenario:
     >               main_window = action.run(main_window, qtbot, monkeypatch, tmp_path)
     
     tests/test_userinteraction/test_usecases.py:75: 
     _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
     tests/gui_actions.py:272: in run
         aa.post_number_switch(
     _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
     
     main_window = <RodTracker.ui.mainwindow.RodTrackWindow object at 0x7f702c9a3ca0>
     rod_id = 12, new_id = 7, mode = <NumberChangeActions.ALL_ONE_CAM: 2>
     initial_state = {'dataset':             x1        y1        z1  ...  seen_gp4  particle  color
     0    -5.289254  3.563160  4.213875  ......3779839, 86.78520334109191], 'rod2_pos': [40.8029642065812, 23.430269667032004, 47.53805048682671, 29.433259962428203]}
     
         def post_number_switch(
             main_window: RodTrackWindow,
             rod_id: int,
             new_id: int,
             mode: Union[NumberChangeActions, None],
             initial_state: dict,
         ):
             # currently displayed/loaded
             rod1_new_pos = get_rod_position(main_window, rod_id)
             if mode is not None:
                 rod2_new_pos = get_rod_position(main_window, new_id)
     >           assert rod1_new_pos == initial_state["rod2_pos"]
     E           AssertionError
     
     tests/action_assertions.py:201: AssertionError
     ------------------------------ Captured log setup ------------------------------
     INFO     RodTracker.ui.loggerwidget:loggerwidget.py:63 /home/runner/.local/share/RodTracker/Session_ovx08pse
     ------------------------------ Captured log call -------------------------------
     INFO     RodTracker.ui.loggerwidget:loggerwidget.py:139 (RodData) Loaded rod file(s) from: /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/RodTracker/resources/example_data/csv
     INFO     RodTracker.ui.loggerwidget:loggerwidget.py:139 (camera_0) (gp3) 25 image file(s) loaded from: /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/RodTracker/resources/example_data/images/gp3
     INFO     RodTracker.ui.loggerwidget:loggerwidget.py:139 (camera_1) (gp4) 25 image file(s) loaded from: /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/RodTracker/resources/example_data/images/gp4
     INFO     RodTracker.ui.loggerwidget:loggerwidget.py:139 (gp4, 500, ) Changed rod #12 ---> #7 of color  in frames >= 500 of gp4.
    

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingenhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions