12 KiB
用户指南
适用于干净服务器环境,从零开始执行测试。
1. 环境准备
1.1 安装 git
sudo dnf install -y git
1.2 克隆代码仓库
git clone https://git.openruyi.cn/woqidaideshi/openruyi-autotest.git
cd openruyi-autotest
1.3 安装 tmt 和 beakerlib
测试用例使用 tmt (Test Management Tool) 框架管理和执行:
# 安装 tmt(基础版,支持本地执行)
sudo dnf install -y tmt
# 安装 beakerlib 测试框架
sudo dnf install -y beakerlib
# beakerlib 运行时依赖
sudo dnf install -y python-six
# 验证安装
tmt --version
rpm -q beakerlib
riscv64 架构:
tmt可能不在 dnf 仓库中,可通过 pip 安装:sudo dnf install -y python3 python3-pip rust gcc gcc-c++ beakerlib sudo pip3 install --break-system-packages tmt
1.4 配置测试拓扑(可选)
测试计划会自动检测当前机器硬件资源(CPU/内存/磁盘/网卡)是否满足测试用例的硬件需求。如需在多台服务器上执行测试,或者自定义服务器连接信息,可配置 topology.env:
# 复制模板
cp topology.env.example topology.env
# 按实际环境修改
vim topology.env
配置变量说明:
| 变量 | 说明 | 默认值 |
|---|---|---|
TEST_SERVER_COUNT |
可用服务器数量 | 1 |
TEST_SERVER_1_HOST |
第 1 台服务器 IP/主机名 | (无) |
TEST_SERVER_1_PORT |
第 1 台服务器 SSH 端口 | 22 |
TEST_SERVER_1_USER |
第 1 台服务器登录用户名 | root |
TEST_SERVER_1_PASSWORD |
第 1 台服务器登录密码 | (无) |
多服务器示例(3 台):
TEST_SERVER_COUNT=3
TEST_SERVER_1_HOST=192.168.1.10
TEST_SERVER_1_PORT=22
TEST_SERVER_1_USER=root
TEST_SERVER_1_PASSWORD=mypassword
TEST_SERVER_2_HOST=192.168.1.11
TEST_SERVER_2_PORT=12055
TEST_SERVER_2_USER=openruyi
TEST_SERVER_2_PASSWORD=mypassword
TEST_SERVER_3_HOST=192.168.1.12
TEST_SERVER_3_USER=root
# 端口/密码未设置时使用默认值 22 / 无密码
未配置
topology.env不影响单机测试。系统将当前机器视为唯一服务器(TEST_SERVER_COUNT默认为 1),硬件资源通过系统命令自动获取。
2. 执行单个测试用例
比如 acl 测试套中的 test_acl_getfacl_basic:
cd openruyi-autotest
tmt run --all --verbose plan --name /plans/functional \
test --name /tests/functional/pkgs/acl/test_acl_getfacl_basic \
provision --feeling-safe
关于
--feeling-safe:tmt 默认会询问用户确认后才执行,加上此参数跳过交互式确认,适合自动化/无人值守场景。
3. 执行单个测试套
比如 acl:
cd openruyi-autotest
tmt run --all plan --name /plans/functional \
test --name /tests/functional/pkgs/acl \
provision --feeling-safe
4. 执行测试类型全量用例
比如功能测试(functional),包含 202 个软件包,共 566 个测试用例:
cd openruyi-autotest
tmt run --all plan --name /plans/functional \
provision --feeling-safe
比如特性测试(feature):
tmt run --all plan --name /plans/feature \
provision --feeling-safe
5. 查看测试结果和日志
5.1 tmt 结果目录
tmt 每次执行都会在 /var/tmp/tmt/run-* 下生成一个运行目录,包含所有测试用例的详细日志:
# 列出所有历史运行
ls -lt /var/tmp/tmt/
# 进入最近一次运行目录
cd $(ls -dt /var/tmp/tmt/run-* | head -1)
运行目录结构:
/var/tmp/tmt/run-XXX/
├── plans/
│ └── {plan-name}/ # 如 functional
│ └── execute/
│ └── data/
│ └── guest/ # 本地执行时为 guest
│ └── default-0/
│ └── tests/functional/pkgs/acl/
│ ├── test_acl_getfacl_basic-1/
│ │ └── output.txt # 该用例的完整输出
│ ├── test_acl_setfacl_basic-2/
│ │ └── output.txt
│ └── ...
└── run.yaml # 运行元数据
5.2 查看单个用例日志
# 进入最近一次运行目录
RUN_DIR=$(ls -dt /var/tmp/tmt/run-* | head -1)
# 路径包含 plans/ 和 guest/default-0/ 层级
BASE="$RUN_DIR/plans/functional/execute/data/guest/default-0"
# 查看某个测试用例的完整输出
cat "$BASE/tests/functional/pkgs/acl/test_acl_getfacl_basic-1/output.txt"
5.3 查看汇总报告
# 简要报告
tmt run --last report
# 详细报告(含每个用例的 stdout/stderr)
tmt run --last report -fvvv
5.4 查看所有用例的执行状态
RUN_DIR=$(ls -dt /var/tmp/tmt/run-* | head -1)
BASE="$RUN_DIR/plans/functional/execute/data/guest/default-0"
# 列出所有用例的 output.txt 并显示最后几行(通常包含 PASS/FAIL)
find "$BASE" -name "output.txt" | sort | while read f; do
dir=$(dirname "$f")
echo "=== $(basename "$dir") ==="
tail -5 "$f"
echo ""
done
6. 执行所有测试脚本
从项目根目录执行全部测试(所有计划):
cd openruyi-autotest
tmt run --all provision --how local --feeling-safe
7. 目录结构速查
tests/
├── smoke/ # 冒烟测试(100 个用例)
│ ├── archive/ # 归档工具(tar, gzip, xz)
│ ├── dev_tools/ # 开发工具
│ ├── disk_fs/ # 磁盘/文件系统
│ ├── filesystem/ # 文件系统操作
│ ├── kernel/ # 内核功能
│ ├── logging/ # 日志系统
│ ├── network/ # 网络工具
│ ├── package_mgmt/ # 包管理
│ ├── permissions/ # 权限管理
│ ├── process/ # 进程管理
│ ├── scripting/ # 脚本语言
│ ├── security/ # 安全相关
│ ├── service_mgmt/ # 服务管理
│ ├── shell_basics/ # Shell 基础
│ ├── system_info/ # 系统信息
│ ├── text_processing/# 文本处理
│ └── user_mgmt/ # 用户管理
├── functional/pkgs/ # 功能测试(202 个包, 566 用例)
│ ├── acl/ # ACL 权限管理(参考标准)
│ ├── attr/ # 扩展属性
│ ├── bash/ # Bash shell
│ ├── coreutils/ # 核心工具集
│ ├── ... # 更多软件包
├── security/ # 安全测试(106 个用例)
│ ├── cve/ # CVE 漏洞验证
│ └── nmap/ # Nmap 端口扫描
├── compatibility/ # 兼容性测试(188 个用例)
│ └── ltp_posix/ # LTP POSIX 接口兼容性
├── performance/ # 性能测试
│ └── unixbench/ # UnixBench 基准测试
├── feature/ # 特性测试
│ └── <xxx>/ # 特性名称
└── reliability/ # 可靠性测试
└── test.sh
8. 常见问题
Q: 执行报错 beakerlib.sh: No such file or directory
sudo dnf install -y beakerlib
Q: tmt 命令找不到
# dnf 安装
sudo dnf install -y tmt
# 或 pip 安装(riscv64)
sudo pip3 install --break-system-packages tmt
Q: 测试因权限不足失败
部分测试脚本使用 sudo 执行特权操作,需确保当前用户有 sudo 权限:
# 验证 sudo 可用
sudo whoami
Q: 只想查看某个计划包含哪些测试(不执行)
tmt plan show /plans/functional
tmt test ls /tests/functional/pkgs/acl
Q: 查看上次执行的详细信息
tmt run --last report -fvvv
注意:
tmt run --last report有时会因 tmt 内部轮询历史数据而较慢。如果只是查看结果摘要,可以直接读取run.yaml或查看各用例的output.txt。
Q: 执行 tmt run 时报 Synchronization lock ... is stale
# 清理旧的 tmt 锁文件(通常由 root 拥有的旧运行残留)
sudo rm -f /var/tmp/tmt-test.pid.lock
9. 实战示例:ACL 测试套
本节以 acl 测试套为例,完整展示从环境准备到查看结果的全流程。
9.1 前提条件
- 一台干净的 openRuyi 服务器(本示例:10.20.237.192:12055)
- 已安装 git、tmt、beakerlib(参考第 1 节)
9.2 克隆仓库并安装依赖
git clone https://git.openruyi.cn/woqidaideshi/openruyi-autotest.git
cd openruyi-autotest
# 安装 tmt 和测试依赖
sudo dnf install -y tmt beakerlib python-six
sudo dnf install -y acl # ACL 测试目标软件包
9.3 (可选)配置 topology.env
cp topology.env.example topology.env
vim topology.env
写入内容:
TEST_SERVER_COUNT=1
TEST_SERVER_1_HOST=10.20.237.192
TEST_SERVER_1_PORT=12055
TEST_SERVER_1_USER=openruyi
TEST_SERVER_1_PASSWORD=openruyi
如果当前用户就是
openruyi且在本机执行,可以不配置topology.env,tmt 会自动检测。
9.4 清理锁文件(重要)
如果之前执行过 tmt 但异常中断,锁文件可能残留:
sudo rm -f /var/tmp/tmt-test.pid.lock
9.5 执行 ACL 测试套
cd ~/openruyi-autotest
tmt run --all plan --name /plans/functional \
test --name /tests/functional/pkgs/acl \
provision --feeling-safe
命令解析:
| 参数 | 含义 |
|---|---|
--all |
跳过交互确认(和 --feeling-safe 配合使用) |
plan --name /plans/functional |
使用功能测试计划(定义在 plans/functional.fmf) |
test --name /tests/functional/pkgs/acl |
只执行 tests/functional/pkgs/acl/ 下的用例 |
provision --feeling-safe |
本地执行,跳过确认 |
预期输出关键行:
Found 1 plan.
summary: 功能测试 - 验证所有功能测试用例
discover
how: fmf
directory: /home/openruyi/openruyi-autotest/tests/functional/pkgs/acl
filter: tag:functional
tests:
/tests/functional/pkgs/acl/test_acl_acl_inheritance
/tests/functional/pkgs/acl/test_acl_acl_permission_verify
...
total: 11 tests
执行过程大约需要 20~30 分钟(取决于服务器性能)。每个测试用例的输出会实时显示在终端中。
9.6 查看结果
方式一:查看汇总报告
cd ~/openruyi-autotest
tmt run --last report
输出示例:
total: 11 tests passed
方式二:遍历所有 output.txt
RUN_DIR=$(ls -dt /var/tmp/tmt/run-* | head -1)
BASE="$RUN_DIR/plans/functional/execute/data/guest/default-0"
find "$BASE" -name "output.txt" | sort | while read f; do
echo "=== $(basename $(dirname "$f")) ==="
tail -3 "$f"
echo ""
done
预期每个用例最后一行都是 EXIT_CODE=0 和 TESTS_RESULT=PASS。
方式三:查看单个用例的输出
BASE="/var/tmp/tmt/run-*/plans/functional/execute/data/guest/default-0"
cat "$BASE/tests/functional/pkgs/acl/test_acl_getfacl_basic-1/output.txt"
9.7 ACL 测试套包含的用例
| 序号 | 用例名 | 说明 |
|---|---|---|
| 1 | test_acl_acl_inheritance |
ACL 权限继承验证 |
| 2 | test_acl_acl_permission_verify |
ACL 权限正确性验证 |
| 3 | test_acl_chacl_command |
chacl 命令功能测试 |
| 4 | test_acl_error_handling |
错误处理与边界情况 |
| 5 | test_acl_getfacl_basic |
getfacl 基本功能 |
| 6 | test_acl_getfacl_command |
getfacl 命令行选项 |
| 7 | test_acl_setfacl_basic |
setfacl 基本功能 |
| 8 | test_acl_setfacl_default_acl |
setfacl 默认 ACL |
| 9 | test_acl_setfacl_modify_acl |
setfacl 修改已有 ACL |
| 10 | test_acl_setfacl_recursive |
setfacl 递归操作 |
| 11 | test_acl_tool_installation |
ACL 工具安装检查 |
共 11 个用例,全部通过即为 ACL 功能正常。此套件可作为其他软件包测试的参考模板。其他
tests/functional/pkgs/<包名>/下的测试套执行方式与此完全相同,只需将test --name中的acl替换为目标包名即可。