From cc49718a60d26cef5fcd3eec74443bef4c6e0d2a Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Fri, 28 Aug 2026 19:18:58 +0300 Subject: [PATCH] Use pytest for testing --- .github/workflows/build.yml | 9 ++--- tools/test.py | 72 +++++++++++++++++++------------------ 2 files changed, 42 insertions(+), 39 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c382c24..5aef2a4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -82,15 +82,16 @@ jobs: run: sudo apt-get install -y libsdl2-dev - name: Build simulator run: make build_simulator - - name: Install pyflix requirements - run: sudo apt install -y python3-pip && pip3 install -r tools/requirements.txt - - name: Run simulator + - name: Install Python requirements + run: sudo apt install -y python3-pip && pip3 install -r tools/requirements.txt && pip3 install pytest + - name: Run simulator and tests env: GAZEBO_MODEL_PATH: ${{ github.workspace }}/gazebo/models GAZEBO_PLUGIN_PATH: ${{ github.workspace }}/gazebo/build + GAZEBO_MODEL_DATABASE_URI: '' # disable downloading models run: | gzserver --verbose gazebo/flix.world & - timeout -k 10s 120s tools/test.py + pytest --capture=no --verbose tools/test.py - uses: actions/upload-artifact@v7 with: name: gazebo-plugin-binary diff --git a/tools/test.py b/tools/test.py index d475c93..c23e4c4 100755 --- a/tools/test.py +++ b/tools/test.py @@ -2,44 +2,46 @@ # Script for testing pyflix and the simulation. -from math import isclose, isnan, isfinite +from pytest import approx +from math import isnan, isfinite +import time from pyflix import Flix -print('=== Connect...') -flix = Flix() +def test(): + print('=== Connect...') + flix = Flix(timeout=20) -print('=== Check initial state') -assert flix.connected -assert flix.mode == 'STAB' -assert not flix.armed -assert flix.landed -assert isnan(flix.voltage) -assert all(isclose(r, 0) for r in flix.rates) -assert isclose(flix.attitude[0], 0) and isclose(flix.attitude[1], 0) and isclose(flix.attitude[2], 0) -assert isclose(flix.attitude[3], 1) -assert all(isclose(a, 0) for a in flix.attitude_euler) -assert all(m == 0 for m in flix.motors) -assert all(isclose(a, 0) for a in flix.acc) -assert all(isclose(g, 0) for g in flix.gyro) -assert all(ch == 0 for ch in flix.channels) + print('=== Check initial state') + time.sleep(1) # give more time for initial state + assert flix.connected + assert flix.mode == 'STAB' + assert not flix.armed + assert flix.landed + assert isnan(flix.voltage) or flix.voltage == approx(4.2) + assert flix.rates == approx((0, 0, 0), abs=0.01) + assert flix.attitude == approx((1, 0, 0, 0), abs=0.01) + assert flix.attitude_euler == approx((0, 0, 0), abs=0.01) + assert all(m == 0 for m in flix.motors) + assert flix.acc == approx((0, 0, 9.81), abs=0.1) + assert flix.gyro == approx((0, 0, 0), abs=0.01) + assert all(ch == 0 for ch in flix.channels) -print('=== Check console commands') -assert 'Time: ' in flix.cli('time') -assert 'Landed: 1' in flix.cli('imu') + print('=== Check console commands') + assert 'Time: ' in flix.cli('time') + assert 'landed: 1' in flix.cli('imu') -print('=== Check parameters') -assert isfinite(flix.get_param('CTL_ATT_P_P')) -flix.set_param('CTL_ATT_P_P', 10.0) + print('=== Check parameters') + assert isfinite(flix.get_param('CTL_ATT_P_P')) + flix.set_param('CTL_ATT_P_P', 10.0) -print('=== Additional checks') -assert flix.wait('connected') is True -assert flix.wait('gyro') is not None -flix.wait('armed', False) -flix.wait('mode', 'STAB') -flix.wait('motors', lambda motors: not any(motors)) -flix.set_armed(True) -flix.wait('armed', True) -flix.set_mode('ACRO') -flix.wait('mode', 'ACRO') -flix.set_mode('AUTO') -flix.wait('mode', 'AUTO') + print('=== Additional checks') + assert flix.wait('gyro') == approx((0, 0, 0), abs=0.01) + flix.wait('armed', False) + flix.wait('mode', 'STAB') + flix.wait('motors', lambda motors: not any(motors)) + flix.set_armed(True) + flix.wait('armed', True) + flix.set_mode('ACRO') + flix.wait('mode', 'ACRO') + flix.set_mode('AUTO') + flix.wait('mode', 'AUTO')