测试运行器:位置参数真的只跑指定路径;文档改成实际能跑通的命令与数字
scripts/run_unit_tests.sh
用法注释里写的是「bash run_unit_tests.sh src/<pkg>/test/test_x.py -x」,但实现是
`pytest "${test_dirs[@]}" "$@"` —— 传进来的路径只是被**追加**到「全部测试目录」
后面,实际仍然跑整仓库。用法示例就是承诺,它不成立会让人以为「我只改了 x,
怎么蹦出别的包的失败」。改成:位置参数里**存在的路径**当作「只跑这些」,
其余(-k / -x / --tb=… 及其取值)原样透传。
docs/HANDBOOK.md §4.3
原文让人逐个包手敲 `python3 -m pytest src/xxx/test`。这条命令在本仓库**会失败**,
而且是两种最容易被误读的失败:
· 少挂一个 src 包 → 收集阶段 ModuleNotFoundError,现象是「0 个测试 / 1 个 error」,
像测试环境坏了;
· 更隐蔽:install/ 里那份**旧的**同名模块会先被找到。实测直接跑
src/arm_sim_gazebo/test 报 `cannot import name 'RESET_GIVE_UP'`,导的是
install/ 里的旧副本,源码里明明有这个符号 —— 测的根本不是你改的那份。
改为统一用 run_unit_tests.sh(它把 src/* 挂到 PYTHONPATH 最前面),并把这段
原因写进文档。顺带把过期的统计数字更新为实测值:608 → 1118 项,
分项 arm_application 233→547、arm_sim_gazebo 236→400、arm_interfaces 46→78。
实测:src/arm_sim_gazebo/test 直跑 = 2 个收集错误;经运行器 = 400 passed。
单文件 28 passed;-k real_preflight = 28 passed / 1 skipped;
无参数全量 = 1118 passed / 1 skipped。
docs/QUICKSTART.md
「第一次实机」以体检开场(它只读、不需要机械臂能动),并列出四项判据各抓什么,
免得现场跳过它直接起栈。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+21
-13
@@ -338,6 +338,7 @@ source scripts/env.sh # 真机环境
|
||||
source scripts/sim_env.sh # 仿真环境(独立 conda)
|
||||
|
||||
# —— 设备与配置 ——
|
||||
bash scripts/run_real_preflight.sh --arm 89 # 真机开工体检(只读,含 RDK/相机/USB/几何)
|
||||
ros2 run arm_interfaces device_check # 设备契约 + site.yaml 必填项
|
||||
bash scripts/show_site_config.sh # site.yaml 解析结果
|
||||
python3 scripts/check_arm_prefixes.py # 含臂名的配置是否跟着当前臂(换臂必跑)
|
||||
@@ -356,29 +357,36 @@ bash scripts/weights.sh doctor --check-engines
|
||||
|
||||
### 4.3 单元测试怎么跑
|
||||
|
||||
**每个功能包都有自己的测试**,改完对应包就跑一下。当前 pytest 收集 **608 项**。
|
||||
**每个功能包都有自己的测试**,改完对应包就跑一下。当前 pytest 收集 **1118 项**
|
||||
(另有 1 项按环境 skip)。
|
||||
|
||||
```bash
|
||||
source scripts/env.sh # 或 sim_env.sh
|
||||
|
||||
# 逐包跑(跳过需要厂商 flexivrdk 包的 flexiv_rdk,那个环境里没有)
|
||||
for d in src/*/test; do
|
||||
case "$d" in src/flexiv_rdk/*) continue;; esac
|
||||
printf '%-28s ' "$d"; python3 -m pytest "$d" -q -p no:cacheprovider 2>&1 | tail -1
|
||||
done
|
||||
|
||||
# 只跑一个包
|
||||
python3 -m pytest src/arm_sim_gazebo/test -q
|
||||
bash scripts/run_unit_tests.sh # 全部
|
||||
bash scripts/run_unit_tests.sh src/arm_kinematics/test # 只跑一个包
|
||||
bash scripts/run_unit_tests.sh src/arm_application/test/test_real_preflight.py
|
||||
bash scripts/run_unit_tests.sh -k gauge # 只跑名字带 gauge 的
|
||||
```
|
||||
|
||||
改动前后对比数量是最省事的回归判据 —— 现在应该是(pytest 收集数,共 608 项):
|
||||
> 用这个脚本,别直接 `python3 -m pytest src/xxx/test`。脚本会把 `src/*` 全部
|
||||
> 挂到 `PYTHONPATH` 最前面,两个原因:
|
||||
>
|
||||
> 1. 测试按**包名**导入,少挂一个包会在收集阶段 `ModuleNotFoundError` ——
|
||||
> 现象是"0 个测试 / 1 个 error",很容易被读成测试环境坏了。
|
||||
> 2. 更隐蔽:`install/` 里那份**旧的**同名模块会先被找到(它在 `PYTHONPATH` 上)。
|
||||
> 实测 `src/arm_sim_gazebo/test` 直接跑会报
|
||||
> `cannot import name 'RESET_GIVE_UP'` —— 导的是 `install/` 里的旧副本,
|
||||
> 源码里明明有这个符号。挂上 `src/` 之后才测的是你改的那份。
|
||||
|
||||
按包统计(改动前后对比数量是最省事的回归判据):
|
||||
|
||||
| 包 | 测试数 | 覆盖什么 |
|
||||
|----|--------|----------|
|
||||
| `arm_application` | 233 | 纯逻辑:滤波器、解析器、几何、参数合并 |
|
||||
| `arm_sim_gazebo` | 236 | 场景校验、URDF 归一化、相机内参、触觉适配 |
|
||||
| `arm_application` | 547 | 纯逻辑:滤波器、解析器、几何、参数合并、装配状态机 |
|
||||
| `arm_sim_gazebo` | 400 | 场景校验、URDF 归一化、相机内参、触觉适配 |
|
||||
| `arm_interfaces` | 78 | 路径解析、清单校验、配置守卫 |
|
||||
| `arm_driver_flexiv` | 69 | 驱动适配、下压控制、超时 |
|
||||
| `arm_interfaces` | 46 | 路径解析、清单校验、配置守卫 |
|
||||
| `arm_kinematics` | 24 | 正逆运动学 |
|
||||
|
||||
> `src/flexiv_rdk/test` 需要厂商的 `flexivrdk` Python 包,仿真环境里没有,
|
||||
|
||||
Reference in New Issue
Block a user