云存储系统手工测试指南
本文档用于手动验证客户端和服务端的主要功能。除特别说明外,命令均在客户端交互界面中执行。
1. 测试前准备
1.1 环境要求
- Linux
- GCC、Make、pthread
- MySQL Client 开发库
- 可访问配置文件中的 MySQL 服务
- MySQL 账号已经能够访问
netdisk数据库
1.2 编译
在项目根目录执行:
make
如果只想检查依赖:
./setup_env.sh check
1.3 启动服务端和客户端
终端 A:
cd server
./bin/cloud_server
终端 B:
cd client
./bin/cloud_client
默认地址是 127.0.0.1:12345,配置见 server/config/server.conf 和 client/config/client.conf。
服务端日志默认在:
server/logs/server.log
另开终端观察日志:
tail -f server/logs/server.log
1.4 准备本地测试文件
在项目根目录执行:
mkdir -p manual_test_files downloads
printf 'cloud-storage-manual-test\n' > manual_test_files/small.txt
dd if=/dev/urandom of=manual_test_files/large.bin bs=1M count=20 status=progress
sha256sum manual_test_files/small.txt manual_test_files/large.bin
测试完成后可清理本地文件:
rm -rf manual_test_files downloads
2. 用户注册、登录和密码验证
2.1 注册新用户
在客户端执行:
signup manual_user manual_pass_123 manual@example.com
预期结果:
- 返回注册成功或类似
OK的响应。 - 用户可以使用该账号登录。
- 数据库
users表中产生用户记录。
2.2 正确登录
login manual_user manual_pass_123
预期结果:
- 登录成功。
- 服务端返回 JWT Token。
- 后续业务命令可以正常执行。
2.3 错误密码
先退出客户端或新开一个客户端,再执行:
login manual_user wrong_password
预期结果:登录失败,不应进入已登录状态。
2.4 未登录访问业务命令
在未登录的客户端执行:
pwd
预期结果:服务端提示需要先登录。
3. 虚拟目录功能
登录成功后依次执行:
pwd
mkdir manual_dir
ls
cd manual_dir
pwd
cd ..
pwd
预期结果:
- 初始
pwd显示用户根目录。 mkdir manual_dir创建目录成功。ls能看到manual_dir/。cd manual_dir成功进入目录。- 进入后
pwd路径发生变化。 cd ..返回上一级目录。
继续测试绝对路径和当前路径:
cd /
pwd
ls
cd ./manual_dir
pwd
cd ..
预期结果:/、. 和 .. 能正确解析。
3.1 目录异常情况
cd not_exists
mkdir manual_dir
预期结果:
- 进入不存在目录失败。
- 创建同名目录时返回错误,不产生重复目录。
4. 普通上传 puts
先进入目标远程目录:
cd manual_dir
上传到远程目录(不需要写远程文件名):
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt ./manual_dir
也可以省略远程目录,此时上传到当前远程目录:
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt
预期结果:
- 客户端显示上传已在后台开始。
- 稍后显示上传成功。
- 服务端日志出现上传相关记录。
ls能看到远程文件。
ls
4.1 上传异常情况
puts /tmp/not_exists.txt ./
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt ./
预期结果:
- 本地不存在的文件上传失败。
- 已存在同名远程文件时上传失败,不覆盖原文件。
5. 文件下载 gets
在客户端执行:
gets small.txt /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/downloads/
预期结果:
- 客户端显示下载已在后台开始。
- 下载完成后自动生成
downloads/small.txt。 - 文件内容和源文件一致:
cmp manual_test_files/small.txt downloads/small.txt
echo $?
输出 0 表示内容一致。
下载到已存在的本地文件时,客户端应询问是否覆盖:
gets small.txt /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/downloads/
输入 y 覆盖,输入 n 取消。
6. 删除文件和目录
删除文件:
rm small.txt
ls
预期结果:文件不再出现在列表中。
递归删除目录:
cd ..
mkdir remove_test
cd remove_test
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt ./
cd ..
rm -r remove_test
ls
预期结果:remove_test 及其内部文件都被删除。
7. 极速秒传
- 上传一个文件并等待成功。
- 删除远程文件,但保留本地测试文件。
- 再次上传相同内容,并使用不同的远程文件名。
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt ./
rm small.txt
mkdir fast_dir
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt fast_dir/
预期结果:第二次上传很快完成,服务端根据 SHA-256 哈希复用 storage_files 中已有的物理文件,而不是重新传输全部数据。
可在日志中搜索哈希或秒传相关记录:
grep -iE 'hash|秒传|fast|upload' server/logs/server.log | tail -n 30
8. 断点续传
客户端会把未完成上传的任务号按文件哈希保存到:
$HOME/.netdisk_upload_tasks/
手工测试步骤:
- 使用较大的文件开始上传:
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/large.bin ./
- 上传开始后,在客户端进程仍运行时中断网络、停止服务端,或结束客户端进程。
- 确认任务文件仍存在:
ls -l "$HOME/.netdisk_upload_tasks"
- 恢复服务端并重新启动客户端,登录同一用户。
- 再次执行相同的上传命令:
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/large.bin ./
预期结果:
- 客户端提示发现未完成上传任务并尝试断点续传。
- 服务端根据
upload_id和已接收大小返回续传偏移量。 - 只发送剩余数据,最终上传成功。
- 成功后对应的本地任务记录被清除。
注意:文件必须保持不变,否则 SHA-256 会变化,客户端不会匹配原断点任务。
9. Token 验证和会话恢复
9.1 正常 Token 验证
登录后执行:
pwd
ls
预期结果:业务命令正常执行,说明客户端携带的 JWT 通过服务端验证。
9.2 Token 失效
可使用两个客户端进行测试:
- 客户端 A 登录并保持运行。
- 等待 Token 过期,或在测试环境修改 JWT 密钥/时间配置后重启服务端。
- 客户端 A 执行:
ls
预期结果:服务端拒绝请求并提示 Token 无效或已过期,需要重新登录。
不要在生产环境中直接修改密钥;该步骤只适合测试环境。
10. 超时踢出
当前配置为 30 秒:
idle_timeout=30
为了缩短测试时间,可在测试环境将 server/config/server.conf 改为:
idle_timeout=5
重启服务端后:
- 客户端登录。
- 不输入任何命令,等待超过 5 秒。
- 再执行:
pwd
预期结果:空闲连接被服务端关闭,客户端检测到断线并尝试重新连接或提示连接状态变化。
传输大文件时不要把“传输中”误判为超时:上传或下载期间服务端会暂停空闲计时,传输结束后再恢复。
测试结束后建议恢复:
idle_timeout=30
11. 断线重连
11.1 客户端自动重连
- 启动客户端并登录。
- 让服务端暂时停止:
pkill -x cloud_server
- 在客户端执行任意业务命令,例如:
pwd
- 重新启动服务端:
cd server
./bin/cloud_server
- 再次在客户端执行:
pwd
预期结果:
- 客户端发现控制连接断开。
connection_ensure()重新建立连接。- 客户端使用缓存的登录信息完成重新登录。
- 客户端恢复之前的工作目录,然后命令继续执行。
11.2 手动确认目录恢复
cd manual_dir
pwd
临时停止并恢复服务端后,再执行:
pwd
预期结果:仍然位于 manual_dir,而不是回到根目录。
12. 日志和并发观察
在终端 C 持续观察日志:
tail -f server/logs/server.log
另开多个客户端,分别执行上传、下载、mkdir 和 pwd。重点观察:
- 客户端 fd、用户 ID 和命令。
- 上传文件名、文件大小、哈希和
upload_id。 - 数据通道创建失败、文件同名和服务器繁忙提示。
- 上传/下载开始、完成和失败记录。
并发上传同一个远程文件名时,预期只有一个请求成功进入上传流程,其余请求提示同名文件正在上传或服务器繁忙。
13. 测试结果记录表
| 编号 | 测试项 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|
| 1 | 注册 | 新用户创建成功 | ||
| 2 | 正确登录 | 返回 JWT | ||
| 3 | 错误密码 | 登录失败 | ||
| 4 | pwd/ls/cd | 目录操作正常 | ||
| 5 | mkdir | 创建目录成功且不重复 | ||
| 6 | 普通 puts | 文件上传成功 | ||
| 7 | gets | 文件下载且内容一致 | ||
| 8 | rm / rm -r | 文件或目录删除成功 | ||
| 9 | 极速秒传 | 相同哈希内容快速复用 | ||
| 10 | 断点续传 | 从偏移量继续并完成 | ||
| 11 | Token 验证 | 无效 Token 被拒绝 | ||
| 12 | 超时踢出 | 空闲连接被关闭 | ||
| 13 | 断线重连 | 登录状态和目录恢复 | ||
| 14 | 日志 | 关键操作有记录 |
14. 一键自动化对照
手工测试完成后,可以运行已有自动化测试进行交叉验证:
python3 tests/test_server.py --skip-build
首次运行或需要重新编译时:
python3 tests/test_server.py
测试报告生成在 tests/reports 目录。