mock单测与libcmavsdk原生库脱钩
conftest新增fake_mavsdk fixture打桩mavsdk.offboard设定点类型, 两组网关测试autouse启用。修复树莓派原生库符号缺失时纯mock测试误失败 (该问题在树莓派实测暴露: 348条全绿不依赖mavsdk原生库)
This commit is contained in:
+39
-1
@@ -1,8 +1,46 @@
|
|||||||
"""pytest 根配置:保证无论从哪个工作目录启动 pytest,均可导入 utils/ 下的两个包。"""
|
"""pytest 根配置:保证无论从哪个工作目录启动 pytest,均可导入 utils/ 下的包;
|
||||||
|
并提供 fake_mavsdk fixture,使网关 mock 单测与真实 libcmavsdk.so 脱钩。"""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
import types
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
_UTILS_DIR = Path(__file__).resolve().parent
|
_UTILS_DIR = Path(__file__).resolve().parent
|
||||||
if str(_UTILS_DIR) not in sys.path:
|
if str(_UTILS_DIR) not in sys.path:
|
||||||
sys.path.insert(0, str(_UTILS_DIR))
|
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
|
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:
|
class FakeOffboard:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.body = []
|
self.body = []
|
||||||
|
|||||||
@@ -20,6 +20,12 @@ from visual_track_control.mavsdk_gateway import MavsdkCommandGateway
|
|||||||
from visual_track_control.types import ControlOutput
|
from visual_track_control.types import ControlOutput
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def _stub_mavsdk(fake_mavsdk):
|
||||||
|
"""本模块全部用例与真实 libcmavsdk.so 脱钩(树莓派原生库符号缺失实测)。"""
|
||||||
|
return fake_mavsdk
|
||||||
|
|
||||||
|
|
||||||
class FakeOffboard:
|
class FakeOffboard:
|
||||||
"""捕获式 offboard mock:记录每次调用的设定点,可注入失败。"""
|
"""捕获式 offboard mock:记录每次调用的设定点,可注入失败。"""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user