Skip to content

Repository files navigation

RGV 小车自动化测试系统

完整的 RGV 小车自动化测试解决方案,支持运动控制、WCS 集成、传感器标定、OTA 升级、负载测试等多种场景。

功能特性

  • 🌐 Web 可视化控制台:浏览器界面配置、启动测试,实时查看状态(新功能!)
  • 完整的测试覆盖:运动控制、WCS 流程、传感器标定、OTA 升级、避障测试、版本检验、网络质量、负载循环
  • 📊 可视化报告:基于 Allure 生成详细的测试报告,支持历史趋势分析
  • 💾 数据持久化:实时数据写入 InfluxDB,测试元数据存储到 MySQL
  • 📢 智能通知:测试完成或失败时自动发送钉钉通知
  • 🔧 灵活配置:支持 YAML 配置文件和环境变量,便于不同环境切换
  • 🎮 多种运行方式:支持 Web 界面、CLI、Makefile、直接 pytest 等多种执行方式

项目结构

rgv_autotest/
├─ autotest/                  # 核心代码
│  ├─ clients/               # 客户端模块
│  │  ├─ main_client.py     # Main 节点客户端(/control、/state)
│  │  ├─ wcs_client.py      # WCS 客户端(Mock/Real)
│  │  └─ ssh_client.py      # SSH/SFTP 客户端(OTA)
│  ├─ core/                  # 核心功能
│  │  ├─ config.py          # 配置管理
│  │  ├─ models.py          # 数据模型
│  │  ├─ influx.py          # InfluxDB 集成
│  │  ├─ mysql.py           # MySQL 集成
│  │  ├─ notifier.py        # 钉钉通知
│  │  └─ asserts.py         # 通用断言
│  └─ utils/                 # 工具模块
│     ├─ retry.py           # 重试策略
│     └─ timeouts.py        # 超时控制
├─ tests/                    # 测试用例
│  ├─ conftest.py           # Pytest 配置
│  ├─ test_motion_semiauto.py    # 运动控制测试
│  ├─ test_wcs_flow.py           # WCS 流程测试
│  ├─ test_calibration.py        # 标定测试
│  ├─ test_ota.py                # OTA 升级测试
│  ├─ test_obstacle.py           # 避障测试
│  ├─ test_versions.py           # 版本检验测试
│  ├─ test_network.py            # 网络质量测试
│  ├─ test_horsetoe.py           # 马蹄光电测试
│  └─ test_load_cycle.py         # 负载循环测试
├─ configs/                  # 配置文件
│  └─ config.yaml           # 默认配置
├─ scripts/                  # 脚本
│  ├─ run_cli.py            # CLI 入口
│  └─ generate_allure.sh    # 生成报告脚本
├─ requirements.txt          # 依赖清单
├─ Makefile                  # Make 命令
└─ README.md                 # 本文档

快速开始

🌐 方式 1:Web 控制台(推荐,可视化操作)

# 1. 激活虚拟环境
venv\Scripts\activate  # Windows

# 2. 启动 Web 服务
make web
#
python scripts/start_web.py

# 3. 打开浏览器访问
# http://localhost:8000

Web 控制台功能:

  • ✅ 可视化选择测试用例
  • ▶️ 一键启动/停止测试
  • 📊 实时查看运行状态和进度
  • 📝 实时日志输出
  • 📈 测试历史记录

详细说明:WEB_QUICKSTART.md


💻 方式 2:命令行(传统方式)

1. 环境准备

Python 版本要求: Python 3.9+

# 克隆项目
git clone <repository-url>
cd rgv_autotest

# 创建虚拟环境
python -m venv venv

# 激活虚拟环境
# Windows:
venv\Scripts\activate
# Linux/Mac:
source venv/bin/activate

# 安装依赖
pip install -r requirements.txt

2. 配置

编辑 configs/config.yaml,根据实际环境修改:

robot:
  base_url: "http://10.12.13.45:9999"  # 机器人 API 地址
  robot_id: "0045"                      # 机器人 ID

influxdb:
  enable: true
  url: "http://10.12.12.118:8086"
  # ... 其他配置

mysql:
  enable: true
  host: "10.12.12.125"
  # ... 其他配置

dingtalk:
  enable: true
  webhook: "https://oapi.dingtalk.com/robot/send?access_token=XXX"

提示: 也可以通过环境变量覆盖配置,例如:

export ROBOT_BASE_URL="http://10.12.13.45:9999"
export ROBOT_ROBOT_ID="0045"

3. 运行测试

方式 1: 使用 Makefile(推荐)

# 查看所有可用命令
make help

# 运行冒烟测试
make test-smoke

# 运行运动控制测试
make test-motion

# 运行所有测试
make test

# 生成 Allure 报告
make allure

# 打开 Allure 报告
make allure-open

方式 2: 使用 CLI 脚本

# 基本用法
python scripts/run_cli.py

# 指定机器人参数
python scripts/run_cli.py --base-url http://10.12.13.45:9999 --robot-id 0045

# 只运行特定测试
python scripts/run_cli.py --tags "motion or ota"
python scripts/run_cli.py --markers smoke

# 生成报告并发送通知
python scripts/run_cli.py --allure --notify

方式 3: 直接使用 pytest

# 运行所有测试
pytest -q --alluredir=reports/allure-results tests/

# 运行特定标记的测试
pytest -q -m smoke --alluredir=reports/allure-results tests/
pytest -q -m motion --alluredir=reports/allure-results tests/

# 运行特定文件
pytest -q tests/test_motion_semiauto.py

# 生成报告
allure generate reports/allure-results -o reports/allure-report --clean
allure open reports/allure-report

测试用例说明

运动控制测试 (test_motion_semiauto.py)

  • 模式切换(手动/半自动/联机)
  • 换向(母道/子道)
  • 移动(带里程计精度验证)
  • 寻签(正向/反向)
  • 顶升/下降
  • 急停与复位

标记: @pytest.mark.motion, @pytest.mark.smoke

WCS 流程测试 (test_wcs_flow.py)

  • 移动任务
  • 取货/放货
  • 充电/停止充电
  • 完整作业流程

标记: @pytest.mark.wcs

注意: 当前使用 MockWcsClient,真实 WCS 接口需补充实现。

标定测试 (test_calibration.py)

  • 1-4 号面避障标定
  • TOF 探货传感器标定
  • 自动移动到标定点并验证精度(±3mm)

标记: @pytest.mark.calibration

OTA 升级测试 (test_ota.py)

  • Hall 传感器 OTA
  • 避障传感器 OTA
  • TOF 传感器 OTA
  • 升级后版本验证
  • Hall 升级后零偏标定

标记: @pytest.mark.ota

注意: 当前为模拟测试,需补充真实 OTA 文件和升级逻辑。

版本检验测试 (test_versions.py)

  • 主控版本
  • 地图版本
  • TOF/避障/Hall 传感器版本
  • 综合版本汇总

标记: @pytest.mark.version, @pytest.mark.smoke

网络质量测试 (test_network.py)

  • Ping 测试(RTT、丢包率)
  • 数据写入 InfluxDB
  • 质量断言(RTT < 100ms, 丢包率 < 5%)

标记: @pytest.mark.network, @pytest.mark.smoke

避障测试 (test_obstacle.py)

  • 1-4 号面避障检测
  • 1/3 号面探货避障
  • 距离与强度验证

标记: @pytest.mark.obstacle

负载循环测试 (test_load_cycle.py)

  • 1.5T 负载下顶升/换向/移动循环
  • 失败率统计
  • 平均耗时计算
  • 异常自动钉钉通知

标记: @pytest.mark.load

配置说明

核心配置项

配置项 说明 默认值
robot.base_url 机器人 API 基础 URL http://10.12.13.45:9999
robot.robot_id 机器人 ID 0045
test.odom_tol_mm 运动用例里程计容差(毫米) 2
test.calib_tol_mm 标定用例里程计容差(毫米) 3
test.wait_move_sec 下发移动后最小等待时间(秒) 2
test.ping_target 网络测试目标 IP 10.12.12.1
test.ping_count Ping 次数 30

环境变量优先级

环境变量 > YAML 配置 > 默认值

示例:

export ROBOT_BASE_URL="http://192.168.1.100:9999"
export ROBOT_ROBOT_ID="0046"
export INFLUXDB_ENABLE="false"

数据存储

InfluxDB

三个 Measurement:

  1. rgv_state: 机器人状态数据

    • Tags: car_id, project
    • Fields: mode, location_x, location_y, motor_mother_velocity, bms_voltage, ...
  2. rgv_network: 网络质量数据

    • Tags: car_id, project
    • Fields: avg_rtt_ms, loss_pct
  3. rgv_assert: 测试断言结果

    • Tags: car_id, suite, project
    • Fields: case, status, detail

MySQL

三个表:

  1. test_plan: 测试计划
  2. test_run: 测试运行记录
  3. test_case: 测试用例记录

钉钉通知

通知时机

  • 测试完成:发送汇总信息(通过率、耗时、报告链接)
  • 测试失败:实时发送失败用例详情(错误信息、请求/响应摘要)

配置

dingtalk:
  enable: true
  webhook: "https://oapi.dingtalk.com/robot/send?access_token=XXX"
  secret: ""  # 可选,签名密钥

Allure 报告

生成报告

# 方式 1: Makefile
make allure

# 方式 2: 脚本
bash scripts/generate_allure.sh

# 方式 3: 直接命令
allure generate reports/allure-results -o reports/allure-report --clean

查看报告

# 打开报告
allure open reports/allure-report

# 或者直接在浏览器打开
# file:///path/to/reports/allure-report/index.html

故障排查

问题: 连接 Main 节点失败

原因: 网络不通或配置错误

解决:

  1. 检查 config.yaml 中的 robot.base_url 是否正确
  2. 确认网络连通性:ping 10.12.13.45
  3. 确认端口开放:telnet 10.12.13.45 9999

问题: InfluxDB/MySQL 写入失败

原因: 数据库连接配置错误或服务未启动

解决:

  1. 检查配置文件中的数据库参数
  2. 测试连接:telnet <host> <port>
  3. 如不需要,可设置 enable: false 禁用

问题: Allure 报告未生成

原因: allure 命令未安装

解决:

# 安装 Allure(需要 Java)
# Mac:
brew install allure

# Windows:
# 从 https://github.com/allure-framework/allure2/releases 下载并配置环境变量

# Linux:
# 参考官方文档安装

问题: 测试用例失败率高

可能原因:

  1. 机器人状态异常(急停、错误等)
  2. 坐标配置不符合现场环境
  3. 网络延迟导致超时

解决:

  1. 先运行冒烟测试:make test-smoke
  2. 检查机器人日志和状态
  3. 调整 config.yaml 中的超时和容差参数
  4. 根据实际环境调整测试用例中的坐标点

扩展开发

添加新的测试用例

  1. tests/ 目录下创建新文件 test_xxx.py
  2. 继承 pytest 的测试类或直接写测试函数
  3. 使用 @pytest.mark.xxx 添加标记
  4. 使用 @allure.feature@allure.story 等装饰器增强报告
  5. 参考现有用例编写断言和步骤

集成真实 WCS 接口

编辑 autotest/clients/wcs_client.py,实现 RealWcsClient 类的方法:

class RealWcsClient(WcsClient):
    def __init__(self, base_url: str, timeout: int = 30):
        self.base_url = base_url
        self.timeout = timeout
    
    def move(self, x: float, y: float, z: Optional[float] = None):
        # 实现真实的 WCS 移动接口调用
        response = requests.post(f"{self.base_url}/move", ...)
        return response.json()
    
    # ... 实现其他方法

然后在 conftest.py 中修改 wcs_client fixture。

添加自定义断言

autotest/core/asserts.py 中添加新的断言函数:

def assert_custom(state: RobotState, expected: Any) -> bool:
    """自定义断言"""
    if state.xxx != expected:
        raise AssertError(f"Custom check failed: {state.xxx} != {expected}")
    return True

最佳实践

  1. 环境隔离: 为不同机器人或环境创建独立的配置文件
  2. 标记分类: 合理使用 pytest marker 分组测试用例
  3. 失败重试: 关键用例可使用 @pytest.mark.flaky(reruns=3) 自动重试
  4. 数据清理: 测试后确保机器人回到安全状态
  5. 报告留存: 定期备份 Allure 报告和数据库记录
  6. 持续集成: 可集成到 Jenkins/GitLab CI 等 CI/CD 系统

依赖清单

主要依赖:

  • pytest: 测试框架
  • allure-pytest: 测试报告
  • requests: HTTP 客户端
  • tenacity: 重试机制
  • pydantic: 数据模型与配置
  • loguru: 日志
  • influxdb-client: InfluxDB 客户端
  • pymysql: MySQL 客户端
  • paramiko: SSH/SFTP 客户端

完整依赖见 requirements.txt

许可证

[根据项目实际情况填写]

联系方式

[根据项目实际情况填写]


版本: 1.0.0
最后更新: 2025-10-29

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages