From 4c1f5d39327a07df1e2d598653f69754c760e5ea Mon Sep 17 00:00:00 2001 From: keita <16924591+keita_sakura@user.noreply.gitee.com> Date: Wed, 23 Sep 2026 17:53:22 +0800 Subject: [PATCH] =?UTF-8?q?mock=E5=8D=95=E6=B5=8B=E4=B8=8Elibcmavsdk?= =?UTF-8?q?=E5=8E=9F=E7=94=9F=E5=BA=93=E8=84=B1=E9=92=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit conftest新增fake_mavsdk fixture打桩mavsdk.offboard设定点类型, 两组网关测试autouse启用。修复树莓派原生库符号缺失时纯mock测试误失败 (该问题在树莓派实测暴露: 348条全绿不依赖mavsdk原生库) --- utils/conftest.py | 40 ++++++++++++++++++- utils/tests/pod_bridge/px4_gateway_test.py | 6 +++ .../mavsdk_gateway_test.py | 6 +++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/utils/conftest.py b/utils/conftest.py index e86fb96..91f67a6 100644 --- a/utils/conftest.py +++ b/utils/conftest.py @@ -1,8 +1,46 @@ -"""pytest 根配置:保证无论从哪个工作目录启动 pytest,均可导入 utils/ 下的两个包。""" +"""pytest 根配置:保证无论从哪个工作目录启动 pytest,均可导入 utils/ 下的包; +并提供 fake_mavsdk fixture,使网关 mock 单测与真实 libcmavsdk.so 脱钩。""" import sys +import types from pathlib import Path +import pytest + _UTILS_DIR = Path(__file__).resolve().parent if str(_UTILS_DIR) not in sys.path: sys.path.insert(0, str(_UTILS_DIR)) + + +@pytest.fixture +def fake_mavsdk(monkeypatch): + """打桩 mavsdk.offboard 设定点类型(VelocityBodyYawspeed / VelocityNedYaw)。 + + MavsdkCommandGateway 构造设定点时惰性 `from mavsdk import offboard`——即便 + offboard 传输层是 mock,也会去加载真实原生库。libcmavsdk.so 损坏或未装的 + 机器(如 libstdc++ 缺新符号的树莓派)上,纯 mock 单测会因此误失败。 + 用法与 fake_serial 打桩 pyserial 同理:sys.modules 注入轻量桩模块。 + """ + offboard_mod = types.ModuleType("mavsdk.offboard") + + class VelocityBodyYawspeed: + def __init__(self, forward_m_s, right_m_s, down_m_s, yawspeed_deg_s): + self.forward_m_s = forward_m_s + self.right_m_s = right_m_s + self.down_m_s = down_m_s + self.yawspeed_deg_s = yawspeed_deg_s + + class VelocityNedYaw: + def __init__(self, north_m_s, east_m_s, down_m_s, yaw_deg): + self.north_m_s = north_m_s + self.east_m_s = east_m_s + self.down_m_s = down_m_s + self.yaw_deg = yaw_deg + + offboard_mod.VelocityBodyYawspeed = VelocityBodyYawspeed + offboard_mod.VelocityNedYaw = VelocityNedYaw + mavsdk_mod = types.ModuleType("mavsdk") + mavsdk_mod.offboard = offboard_mod + monkeypatch.setitem(sys.modules, "mavsdk", mavsdk_mod) + monkeypatch.setitem(sys.modules, "mavsdk.offboard", offboard_mod) + return offboard_mod diff --git a/utils/tests/pod_bridge/px4_gateway_test.py b/utils/tests/pod_bridge/px4_gateway_test.py index 8e93717..20c7c1f 100644 --- a/utils/tests/pod_bridge/px4_gateway_test.py +++ b/utils/tests/pod_bridge/px4_gateway_test.py @@ -13,6 +13,12 @@ import pytest from pod_bridge.px4_gateway import OwnState, Px4Gateway, _enum_int +@pytest.fixture(autouse=True) +def _stub_mavsdk(fake_mavsdk): + """本模块全部用例与真实 libcmavsdk.so 脱钩(树莓派原生库符号缺失实测)。""" + return fake_mavsdk + + class FakeOffboard: def __init__(self): self.body = [] diff --git a/utils/tests/visual_track_control/mavsdk_gateway_test.py b/utils/tests/visual_track_control/mavsdk_gateway_test.py index 1221f4b..7b07c46 100644 --- a/utils/tests/visual_track_control/mavsdk_gateway_test.py +++ b/utils/tests/visual_track_control/mavsdk_gateway_test.py @@ -20,6 +20,12 @@ from visual_track_control.mavsdk_gateway import MavsdkCommandGateway from visual_track_control.types import ControlOutput +@pytest.fixture(autouse=True) +def _stub_mavsdk(fake_mavsdk): + """本模块全部用例与真实 libcmavsdk.so 脱钩(树莓派原生库符号缺失实测)。""" + return fake_mavsdk + + class FakeOffboard: """捕获式 offboard mock:记录每次调用的设定点,可注入失败。"""