feat(level1): ROS2 完全体 12 包 / 80 测试 / 23 文档 / 工程化 / Docker 分组

This commit is contained in:
xs
2026-08-04 10:19:47 +08:00
parent 5ef38ab508
commit 549d6b337e
141 changed files with 8949 additions and 1594 deletions
+39
View File
@@ -0,0 +1,39 @@
"""pytest 共享 fixtures - py_srv 测试。"""
from typing import Iterator
import pytest
import rclpy
from py_srv.add_two_ints_client import AddTwoIntsClient
from py_srv.add_two_ints_server import AddTwoIntsServer
@pytest.fixture(scope='session')
def ros_context() -> Iterator[None]:
"""session 级 rclpy 上下文。"""
rclpy.init()
try:
yield
finally:
if rclpy.ok():
rclpy.shutdown()
@pytest.fixture
def server(ros_context: None) -> Iterator[AddTwoIntsServer]:
"""每个测试一个独立 server 实例。"""
node = AddTwoIntsServer()
try:
yield node
finally:
node.destroy_node()
@pytest.fixture
def client(ros_context: None) -> Iterator[AddTwoIntsClient]:
"""每个测试一个独立 client 实例。"""
node = AddTwoIntsClient()
try:
yield node
finally:
node.destroy_node()
+43
View File
@@ -0,0 +1,43 @@
"""测试 AddTwoIntsServiceClient 客户端调用服务端(同进程)。"""
import time
import rclpy
import pytest
from example_interfaces.srv import AddTwoInts
from py_srv.add_two_ints_server import AddTwoIntsServer
from py_srv.add_two_ints_client import AddTwoIntsClient
def test_client_calls_server_inproc(ros_context: None) -> None:
"""同进程 spin:server + client,验证 12+30=42。"""
server = AddTwoIntsServer()
client = AddTwoIntsClient()
executor = rclpy.executors.SingleThreadedExecutor()
executor.add_node(server)
executor.add_node(client)
# 触发 client 调用
result_future_container: list = []
def call_in_thread() -> None:
# 给点时间让 server 注册(同进程也需要一点 spin 时间)
deadline = time.time() + 2.0
while time.time() < deadline:
executor.spin_once(timeout_sec=0.05)
if client._client.service_is_ready():
break
result = client.call_once(12, 30, timeout_sec=3.0)
result_future_container.append(result)
import threading
t = threading.Thread(target=call_in_thread)
t.start()
t.join(timeout=5.0)
server.destroy_node()
client.destroy_node()
assert len(result_future_container) == 1
assert result_future_container[0] == 42
+45
View File
@@ -0,0 +1,45 @@
"""测试 AddTwoIntsServiceRequest 服务端处理逻辑。"""
from py_srv.add_two_ints_server import AddTwoIntsServer
def test_server_node_name(server: AddTwoIntsServer) -> None:
"""默认节点名正确。"""
assert server.get_name() == 'add_two_ints_server'
def test_server_service_name(server: AddTwoIntsServer) -> None:
"""默认 service_name 参数正确。"""
assert server.get_parameter('service_name').value == 'add_two_ints'
def test_server_handle_positive(server: AddTwoIntsServer) -> None:
"""正数加法正确。"""
from example_interfaces.srv import AddTwoInts
req = AddTwoInts.Request()
req.a = 12
req.b = 30
resp = AddTwoInts.Response()
out = server._handle_request(req, resp)
assert out.sum == 42
def test_server_handle_negative(server: AddTwoIntsServer) -> None:
"""负数加法正确。"""
from example_interfaces.srv import AddTwoInts
req = AddTwoInts.Request()
req.a = -5
req.b = 3
resp = AddTwoInts.Response()
out = server._handle_request(req, resp)
assert out.sum == -2
def test_server_handle_zero(server: AddTwoIntsServer) -> None:
"""零加法正确。"""
from example_interfaces.srv import AddTwoInts
req = AddTwoInts.Request()
req.a = 0
req.b = 0
resp = AddTwoInts.Response()
out = server._handle_request(req, resp)
assert out.sum == 0