cRedisClient 单元测试
简介
Demo_RedisTest.bas 提供了 cRedisClient 的全功能单元测试,覆盖连接管理、5 种数据类型、事务、数据库切换、属性访问和错误处理。
源文件位置: src\Demos\Redis\Demo_RedisTest.bas
运行方式: 在 VB6 IDE 的立即窗口中执行 Demo_RedisTest.TestRedisClient
测试环境
| 项目 | 说明 |
|---|---|
| Redis 服务器 | dbserver.cc:9736 |
| Redis 版本 | 8.2.3 |
| 协议 | RESP(非 TLS) |
| 客户端类 | cRedisClient |
测试模块与预期结果
[1] 连接测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 建立连接 | Connect("dbserver.cc", 9736) | 返回 True |
| 连接状态 | Connected | True |
| 主机名 | Host | dbserver.cc |
| 端口 | Port | 9736 |
| 心跳检测 | Ping() | "PONG" |
[2] 基础命令测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 设置键值 | Set_("test_key", "test_value") | True |
| 获取键值 | Get_("test_key") | "test_value" |
| 设带过期键 | Set_("expire_key", "will_expire", 10, 0) | True |
| 查看过期时间 | TTL("expire_key") | 10 |
| 键存在 | Exists("test_key") | 1 |
| 键不存在 | Exists("nonexistent") | 0 |
| 删除键 | Del("test_key") | 1 |
| 删除后再查 | Exists("test_key") | 0 |
| 模式匹配 | Keys("pattern_test*") | 返回 2 个键的数组 |
[3] String 操作测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 自增 | Incr("counter") (初始 "10") | 11 |
| 再次自增 | Incr("counter") | 12 |
| 自减 | Decr("counter") | 11 |
| 批量获取 | MGet("mkey1", "mkey2", "mkey3", "nonexistent") | 4 个元素的数组,不存在的键返回空字符串 |
[4] Hash 操作测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 设置字段 | HSet("user:1", "name", "张三") | True |
| 获取字段 | HGet("user:1", "name") | "张三" |
| 字段存在 | HExists("user:1", "name") | True |
| 字段不存在 | HExists("user:1", "email") | False |
| 批量获取 | HMGet("user:1", "name", "age", "city") | 3 个元素的数组 |
| 获取全部 | HGetAll("user:1") | Dictionary 包含 name/age/city |
| 删除字段 | HDel("user:1", "age") | 1 |
[5] List 操作测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 左侧插入3次 | LPush("mylist", ...) | 长度 = 3 |
| 右侧插入2次 | RPush("mylist", ...) | 长度 = 5 |
| 列表长度 | LLen("mylist") | 5 |
| 范围查询 | LRange("mylist", 0, -1) | 5 个元素,顺序: item3, item2, item1, item4, item5 |
| 左侧弹出 | LPop("mylist") | "item3" |
| 右侧弹出 | RPop("mylist") | "item5" |
[6] Set 操作测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 添加成员 | SAdd("myset", "apple") 等 | 新增 3 个成员 |
| 获取全部 | SMembers("myset") | 3 个元素(无序) |
| 成员数量 | SCard("myset") | 3 |
| 成员存在 | SIsMember("myset", "apple") | True |
| 成员不存在 | SIsMember("myset", "grape") | False |
| 删除成员 | SRem("myset", "banana") | 1 |
[7] Sorted Set 操作测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 添加带分数成员 | ZAdd("leaderboard", 100, "player1") 等 | 累计添加成员 |
| 按分数范围查询 | ZRange("leaderboard", 0, -1) | player1, player3, player2(按分数升序) |
| 带分数查询 | ZRange("leaderboard", 0, -1, True) | 交替返回 member/score |
| 成员数量 | ZCard("leaderboard") | 3 |
| 删除成员 | ZRem("leaderboard", "player3") | 1 |
[8] 事务操作测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 事务前状态 | InTransaction | False |
| 开启事务 | Multi() | True |
| 事务中状态 | InTransaction | True |
| 事务中执行命令 | Set_ × 3 | 命令被缓存 |
| 提交事务 | Exec() | 返回 3 个结果的数组,均为 "OK" |
| 提交后状态 | InTransaction | False |
| 事务回滚 | Multi() + Set_ + Discard() | 命令未执行,键不存在 |
[9] 服务器信息测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 心跳检测 | Ping() | "PONG" |
| 服务器信息 | Info("server") | 包含 redis_version 等字段 |
| 全部信息 | Info() | 返回完整 INFO 文本 |
[10] 数据库切换测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 默认数据库 | DbIndex | 0 |
| 切换数据库 | SelectDb(1) | True |
| 切换后索引 | DbIndex | 1 |
| 写入隔离 | db1 SET + db0 GET | db0 中不存在该键 |
| 切回数据库 | SelectDb(0) | True |
[11] 属性测试
| 属性 | 预期值 |
|---|---|
Host | dbserver.cc |
Port | 9736 |
Connected | True |
DbIndex | 0 |
Timeout | 5 |
InTransaction | False |
InPipeline | False |
[12] 错误处理测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 获取不存在的键 | Get_("nonexistent_key_12345") | 空字符串 "" |
| 删除不存在的键 | Del("nonexistent_key_12345") | 0 |
[13] 清理测试数据
自动清理所有测试过程中创建的临时键(expire_key, counter 等)。
[14] 断开连接
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 断开连接 | Disconnect() | — |
| 连接状态 | Connected | False |
测试输出样例
==========================================
cRedisClient 全功能单元测试
==========================================
[1] 连接测试
----------------------------------------
连接: 成功
Connected: True
Host: dbserver.cc
Port: 9736
PING: PONG
[2] 基础命令测试
----------------------------------------
SET test_key: 成功
GET test_key: test_value
SET with EX(10s): 成功
TTL expire_key: 10
EXISTS test_key: 1
EXISTS expire_key: 1
EXISTS nonexistent: 0
DEL test_key: 1 个键被删除
EXISTS test_key after DEL: 0
KEYS pattern_test*: 找到 2 个键
- pattern_test1
- pattern_test2
[3] String 操作测试
----------------------------------------
INCR counter: 11
INCR counter again: 12
DECR counter: 11
MGET mkey1, mkey2, mkey3, nonexistent:
[0]: value1
[1]: value2
[2]: value3
[3]:
[4] Hash 操作测试
----------------------------------------
HSET user:1 name: 成功
HGET user:1 name: 张三
HGET user:1 age: 25
HGET user:1 city: 北京
HEXISTS user:1 name: True
HEXISTS user:1 email: False
HMGET user:1 name, age, city:
[0]: 张三
[1]: 25
[2]: 北京
HGETALL user:1:
name: 张三
age: 25
city: 北京
HDEL user:1 age: 删除 1 个字段
[5] List 操作测试
----------------------------------------
LPUSH mylist 3次: 长度=3
RPUSH mylist 2次: 长度=5
LLEN mylist: 5
LRANGE mylist 0 -1:
[0]: item3
[1]: item2
[2]: item1
[3]: item4
[4]: item5
LPOP mylist: item3
RPOP mylist: item5
[6] Set 操作测试
----------------------------------------
SADD myset apple, banana, orange: 新增 3 个成员
SMEMBERS myset:
- apple
- banana
- orange
SCARD myset: 3
SISMEMBER myset apple: True
SISMEMBER myset grape: False
SREM myset banana: 删除 1 个成员
[7] Sorted Set 操作测试
----------------------------------------
ZADD leaderboard 3 members: 最新新增 1 个成员
ZRANGE leaderboard 0 -1:
- player1
- player3
- player2
ZRANGE leaderboard 0 -1 WITHSCORES:
- player1: 100
- player3: 150
- player2: 200
ZCARD leaderboard: 3
ZREM leaderboard player3: 删除 1 个成员
[8] 事务操作测试
----------------------------------------
InTransaction: False
MULTI: 成功
InTransaction: True
在事务中执行了3个 SET 命令
EXEC: 返回 3 个结果
[0]: OK
[1]: OK
[2]: OK
GET trans_key1: value1
InTransaction: False
DISCARD: 成功
EXISTS discard_key after DISCARD: 0 (应为0)
[9] 服务器操作测试
----------------------------------------
PING: PONG
INFO server: (前100字符) # Server
redis_version:8.2.3
redis_git_sha1:00000000
redis_git_dirty:1
redis_build_id:c978de5219...
INFO: 6373 字节
[10] 数据库切换测试
----------------------------------------
当前 DbIndex: 0
SELECT 1: 成功
DbIndex: 1
GET db1_key: in_database_1
SELECT 0: 成功
DbIndex: 0
EXISTS db1_key in db0: 0 (应为0)
[11] 属性测试
----------------------------------------
Host: dbserver.cc
Port: 9736
Connected: True
DbIndex: 0
Timeout: 5
InTransaction: False
InPipeline: False
[12] 错误处理测试
----------------------------------------
GET nonexistent_key_12345: '' (应为空)
DEL nonexistent_key_12345: 0 (应为0)
[13] 清理测试数据
----------------------------------------
[14] 断开连接
----------------------------------------
Connected after Disconnect: False
==========================================
测试完成!
==========================================覆盖率统计
| 类别 | 测试方法数 | 说明 |
|---|---|---|
| 连接管理 | 2 | Connect, Disconnect |
| 基础命令 | 5 | Set_, Get_, Del, Exists, Keys, TTL |
| String | 4 | Incr, Decr, MGet, Set_ (带 EX) |
| Hash | 5 | HSet, HGet, HMGet, HGetAll, HExists, HDel |
| List | 6 | LPush, RPush, LPop, RPop, LLen, LRange |
| Set | 5 | SAdd, SMembers, SCard, SIsMember, SRem |
| Sorted Set | 4 | ZAdd, ZRange, ZCard, ZRem |
| 事务 | 4 | Multi, Exec, Discard, InTransaction |
| 服务器 | 2 | Ping, Info |
| 数据库 | 2 | SelectDb, DbIndex |
| 属性 | 7 | Host, Port, Connected, DbIndex, Timeout, InTransaction, InPipeline |
| 错误处理 | 2 | 不存在键的 Get/Del |
| 合计 | 48 |
最后更新: 2026-06-16