mock单测与libcmavsdk原生库脱钩

conftest新增fake_mavsdk fixture打桩mavsdk.offboard设定点类型,
两组网关测试autouse启用。修复树莓派原生库符号缺失时纯mock测试误失败
(该问题在树莓派实测暴露: 348条全绿不依赖mavsdk原生库)
This commit is contained in:
keita
2026-09-23 17:53:22 +08:00
parent 477ad5f5de
commit 4c1f5d3932
3 changed files with 51 additions and 1 deletions
+39 -1
View File
@@ -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
@@ -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 = []
@@ -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:记录每次调用的设定点,可注入失败。"""