feat(level1): ROS2 完全体 12 包 / 80 测试 / 23 文档 / 工程化 / Docker 分组
This commit is contained in:
@@ -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()
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user