一、实验目的
验证自主开发的 unload 程序是否能够正确执行文件或目录的卸载操作,确保其逻辑符合设计预期。
掌握利用 test 命令(测试工具)对程序进行功能验证的方法,涵盖边界条件与各类异常场景的测试覆盖。
定位 unload 程序在实际运行过程中可能出现的逻辑缺陷、权限控制问题或执行异常,并据此完成功能优化。
深入理解文件系统的基本操作机制,特别是卸载操作的底层实现原理,包括文件句柄释放、路径清理及权限校验等关键环节。
二、实验平台
| 类别 | 详情 |
|---|---|
| 操作系统 | Linux(Ubuntu 22.04 LTS)(64位) |
| 硬件环境 | RK3568开发板 |
| 开发工具 | GCC/G++(版本9.4.0及以上)、Vim/VS Code、Make工具 |
| 测试工具 | Linux内置test命令、Shell脚本、ls/rm/df等辅助命令、strace(调试工具) |
| 编程语言 | C语言(用于unload程序开发)、Shell脚本(用于测试用例编写) |
三、实验内容
本实验的核心任务是使用 test 测试工具结合 Shell 脚本,对自行编写的 unload 程序进行全面的功能测试,重点验证其在各种场景下执行文件或目录卸载的能力。该程序的设计目标为:接收用户传入的文件或目录路径作为参数,安全地完成删除操作,同时具备路径合法性检查、权限验证、非空目录递归处理(可选)以及清晰的错误提示机制。
通过构建多组测试用例,覆盖正常流程、边界情况和异常输入,借助 test 命令判断程序返回值及系统状态变化,确认其行为是否符合预期。
四、实验步骤
(一)实验准备阶段
1. unload 程序确认
确保 unload 程序已完成编写,主要功能模块如下:
- 解析命令行输入的目标路径;
- 检查参数有效性(是否提供路径、路径是否存在);
- 验证当前用户对该路径的操作权限;
- 执行卸载动作(普通文件直接删除,目录支持递归移除);
- 输出执行结果(成功或失败),并在出错时返回具体原因(如权限不足、路径不存在等)。
gcc unload.c -o unload
2. 编译程序
使用 GCC 进行编译,确保无语法错误并生成可执行文件。
3. 测试环境搭建
创建专用测试目录结构以模拟真实使用场景。
mkdir -p /tmp/unload_test # 测试根目录
touch /tmp/unload_test/file1.txt # 普通文件
echo "test content" > /tmp/unload_test/file1.txt
mkdir /tmp/unload_test/dir1 # 空目录
touch /tmp/unload_test/dir1/file2.txt # 非空目录下的文件
chmod 400 /tmp/unload_test/readonly.txt # 只读文件(用于权限测试)
设计通用测试脚本模板,基于 test 命令实现自动化断言判断,例如使用:
test -f 路径 —— 判断目标是否为普通文件
test $? -eq 0 —— 检查程序执行后返回码是否为成功
(二)测试用例设计与执行
围绕核心功能设计以下测试用例,逐项执行并记录响应结果:
| 测试用例编号 | 测试场景 | 测试命令(核心test逻辑) | 预期结果 |
|---|---|---|---|
| 01 | 卸载存在的普通文件 | |
返回1(表示文件已不存在,卸载成功) |
| 02 | 卸载空目录 | |
返回1(目录被删除,不再存在) |
| 03 | 卸载非空目录 | |
返回1(递归删除完成,目录彻底清除) |
| 04 | 卸载不存在的文件 | |
返回0(程序应返回错误码1,test判定成功,说明异常被捕获) |
| 05 | 卸载无权限的文件 | |
返回0(程序返回错误码2,表明“权限不足”被正确识别) |
| 06 | 未传入参数执行unload程序 | |
返回0(程序返回错误码3,test判断成立,说明参数缺失异常已处理) |
(三)执行步骤细化
1. 单个用例执行示例
以“卸载存在的普通文件”为例,按以下流程操作:
# 1. 确认测试文件存在
test -f /tmp/unload_test/file1.txt && echo "文件存在,准备测试"
# 2. 执行unload程序
./unload /tmp/unload_test/file1.txt
# 3. 用test验证文件是否被卸载
test -f /tmp/unload_test/file1.txt
# 4. 查看test返回值(0表示文件存在,1表示文件不存在)
echo $?
2. 批量测试执行
将所有测试用例整合至一个 Shell 脚本中,提升效率。
test_unload.sh
#!/bin/bash
# 测试脚本初始化
TEST_DIR="/tmp/unload_test"
mkdir -p $TEST_DIR
# 重置测试环境
rm -rf $TEST_DIR/*
touch $TEST_DIR/file1.txt
mkdir -p $TEST_DIR/dir1 && touch $TEST_DIR/dir1/file2.txt
touch $TEST_DIR/readonly.txt && chmod 400 $TEST_DIR/readonly.txt
# 测试用例1:卸载普通文件
echo "测试用例01:卸载存在的普通文件"
./unload $TEST_DIR/file1.txt
if test -f $TEST_DIR/file1.txt; then
echo "失败:文件未被卸载"
else
echo "成功:文件已卸载"
fi
# 测试用例2:卸载空目录(先重建)
echo -e "\n测试用例02:卸载空目录"
mkdir $TEST_DIR/dir1
./unload $TEST_DIR/dir1
if test -d $TEST_DIR/dir1; then
echo "失败:目录未被卸载"
else
echo "成功:目录已卸载"
fi
# 其余测试用例省略,按相同逻辑添加
运行脚本并观察输出:
chmod +x test_unload.sh && ./test_unload.sh
记录每个测试点的实际返回值与系统状态。
3. 异常场景调试
若某个测试未达预期,引入调试工具进行追踪:
strace
使用 strace 工具监控系统调用过程:
strace ./unload /tmp/unload_test/readonly.txt
分析日志信息,排查权限校验失败、文件删除失败等问题所在。
(四)结果记录与分析
详细记录各测试用例中 test 命令的返回值、程序输出信息以及文件系统的实际状态。
将实际结果与预期对比,标记不符合项,分析根本原因,例如:
- 未处理非空目录的递归删除;
- 权限判断逻辑存在漏洞;
- 缺少必要的参数校验机制。
根据发现的问题修改 unload 源码,重新编译并重复测试流程,直至全部用例通过验证。
(五)实验收尾
完成测试后清理测试数据,恢复环境整洁。
rm -rf /tmp/unload_test
整理程序运行日志与 test 命令输出,汇总形成完整的功能验证报告。
五、实验总结
本次实验通过 test 命令实现了对 unload 程序卸载功能的全场景覆盖测试。结果显示,程序在普通文件、空目录及非空目录的卸载方面均表现正常,且对常见异常(如路径不存在、权限不足、参数缺失)均能准确捕获并返回对应错误码,整体功能达到设计要求。
但在测试中也发现程序尚未支持符号链接文件的卸载处理,当前逻辑无法区分软链接与其指向目标,存在误删风险,后续需补充相关判断与安全策略。
实践证明,test 命令作为 Linux 系统下的轻量级测试工具,配合 Shell 脚本能高效完成程序行为验证,尤其适用于返回值判断与文件状态检测,显著提升了测试自动化程度与验证效率。


雷达卡


京公网安备 11010802022788号







