cRedisClient Unit Testing
Overview
Demo_RedisTest.bas provides full-featured unit testing for cRedisClient, covering connection management, 5 data types, transactions, database switching, property access, and error handling.
Source File: src\Demos\Redis\Demo_RedisTest.bas
How to Run: Execute Demo_RedisTest.TestRedisClient in the VB6 IDE Immediate Window
Test Environment
| Item | Description |
|---|---|
| Redis Server | dbserver.cc:9736 |
| Redis Version | 8.2.3 |
| Protocol | RESP (non-TLS) |
| Client Class | cRedisClient |
Test Modules and Expected Results
[1] Connection Test
| Test Case | Method | Expected Result |
|---|---|---|
| Establish connection | Connect("dbserver.cc", 9736) | Returns True |
| Connection status | Connected | True |
| Host name | Host | dbserver.cc |
| Port | Port | 9736 |
| Heartbeat | Ping() | "PONG" |
[2] Basic Commands Test
| Test Case | Method | Expected Result |
|---|---|---|
| Set key-value | Set_("test_key", "test_value") | True |
| Get key-value | Get_("test_key") | "test_value" |
| Set with expiry | Set_("expire_key", "will_expire", 10, 0) | True |
| Check TTL | TTL("expire_key") | 10 |
| Key exists | Exists("test_key") | 1 |
| Key not exists | Exists("nonexistent") | 0 |
| Delete key | Del("test_key") | 1 |
| After deletion | Exists("test_key") | 0 |
| Pattern match | Keys("pattern_test*") | Returns array of 2 keys |
[3] String Operations Test
| Test Case | Method | Expected Result |
|---|---|---|
| Increment | Incr("counter") (initial "10") | 11 |
| Increment again | Incr("counter") | 12 |
| Decrement | Decr("counter") | 11 |
| Batch get | MGet("mkey1", "mkey2", "mkey3", "nonexistent") | 4-element array, non-existent key returns empty string |
[4] Hash Operations Test
| Test Case | Method | Expected Result |
|---|---|---|
| Set field | HSet("user:1", "name", "Zhang San") | True |
| Get field | HGet("user:1", "name") | "Zhang San" |
| Field exists | HExists("user:1", "name") | True |
| Field not exists | HExists("user:1", "email") | False |
| Batch get | HMGet("user:1", "name", "age", "city") | 3-element array |
| Get all | HGetAll("user:1") | Dictionary containing name/age/city |
| Delete field | HDel("user:1", "age") | 1 |
[5] List Operations Test
| Test Case | Method | Expected Result |
|---|---|---|
| Left push 3 times | LPush("mylist", ...) | Length = 3 |
| Right push 2 times | RPush("mylist", ...) | Length = 5 |
| List length | LLen("mylist") | 5 |
| Range query | LRange("mylist", 0, -1) | 5 elements, order: item3, item2, item1, item4, item5 |
| Left pop | LPop("mylist") | "item3" |
| Right pop | RPop("mylist") | "item5" |
[6] Set Operations Test
| Test Case | Method | Expected Result |
|---|---|---|
| Add members | SAdd("myset", "apple") etc. | Added 3 members |
| Get all | SMembers("myset") | 3 elements (unordered) |
| Member count | SCard("myset") | 3 |
| Member exists | SIsMember("myset", "apple") | True |
| Member not exists | SIsMember("myset", "grape") | False |
| Remove member | SRem("myset", "banana") | 1 |
[7] Sorted Set Operations Test
| Test Case | Method | Expected Result |
|---|---|---|
| Add with score | ZAdd("leaderboard", 100, "player1") etc. | Cumulative members added |
| Query by score range | ZRange("leaderboard", 0, -1) | player1, player3, player2 (ascending by score) |
| With scores query | ZRange("leaderboard", 0, -1, True) | Alternating member/score |
| Member count | ZCard("leaderboard") | 3 |
| Remove member | ZRem("leaderboard", "player3") | 1 |
[8] Transaction Operations Test
| Test Case | Method | Expected Result |
|---|---|---|
| Before transaction | InTransaction | False |
| Start transaction | Multi() | True |
| In transaction | InTransaction | True |
| Execute commands in transaction | Set_ x 3 | Commands cached |
| Commit transaction | Exec() | Returns 3-element array, all "OK" |
| After commit | InTransaction | False |
| Rollback transaction | Multi() + Set_ + Discard() | Commands not executed, key doesn't exist |
[9] Server Information Test
| Test Case | Method | Expected Result |
|---|---|---|
| Heartbeat | Ping() | "PONG" |
| Server info | Info("server") | Contains redis_version etc. |
| Full info | Info() | Returns complete INFO text |
[10] Database Switching Test
| Test Case | Method | Expected Result |
|---|---|---|
| Default database | DbIndex | 0 |
| Switch database | SelectDb(1) | True |
| After switch index | DbIndex | 1 |
| Write isolation | db1 SET + db0 GET | Key doesn't exist in db0 |
| Switch back | SelectDb(0) | True |
[11] Properties Test
| Property | Expected Value |
|---|---|
Host | dbserver.cc |
Port | 9736 |
Connected | True |
DbIndex | 0 |
Timeout | 5 |
InTransaction | False |
InPipeline | False |
[12] Error Handling Test
| Test Case | Method | Expected Result |
|---|---|---|
| Get non-existent key | Get_("nonexistent_key_12345") | Empty string "" |
| Delete non-existent key | Del("nonexistent_key_12345") | 0 |
[13] Cleanup Test Data
Automatically cleans up all temporary keys created during testing (expire_key, counter, etc.).
[14] Disconnect
| Test Case | Method | Expected Result |
|---|---|---|
| Disconnect | Disconnect() | - |
| Connection status | Connected | False |
Test Output Sample
==========================================
cRedisClient Full Unit Test
==========================================
[1] Connection Test
----------------------------------------
Connect: Success
Connected: True
Host: dbserver.cc
Port: 9736
PING: PONG
[2] Basic Commands Test
----------------------------------------
SET test_key: Success
GET test_key: test_value
SET with EX(10s): Success
TTL expire_key: 10
EXISTS test_key: 1
EXISTS expire_key: 1
EXISTS nonexistent: 0
DEL test_key: 1 key deleted
EXISTS test_key after DEL: 0
KEYS pattern_test*: Found 2 keys
- pattern_test1
- pattern_test2
[3] String Operations Test
----------------------------------------
INCR counter: 11
INCR counter again: 12
DECR counter: 11
MGET mkey1, mkey2, mkey3, nonexistent:
[0]: value1
[1]: value2
[2]: value3
[3]:
[4] Hash Operations Test
----------------------------------------
HSET user:1 name: Success
HGET user:1 name: Zhang San
HGET user:1 age: 25
HGET user:1 city: Beijing
HEXISTS user:1 name: True
HEXISTS user:1 email: False
HMGET user:1 name, age, city:
[0]: Zhang San
[1]: 25
[2]: Beijing
HGETALL user:1:
name: Zhang San
age: 25
city: Beijing
HDEL user:1 age: 1 field deleted
[5] List Operations Test
----------------------------------------
LPUSH mylist 3 times: length=3
RPUSH mylist 2 times: length=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 Operations Test
----------------------------------------
SADD myset apple, banana, orange: Added 3 members
SMEMBERS myset:
- apple
- banana
- orange
SCARD myset: 3
SISMEMBER myset apple: True
SISMEMBER myset grape: False
SREM myset banana: 1 member removed
[7] Sorted Set Operations Test
----------------------------------------
ZADD leaderboard 3 members: Latest 1 member added
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 member removed
[8] Transaction Operations Test
----------------------------------------
InTransaction: False
MULTI: Success
InTransaction: True
Executed 3 SET commands in transaction
EXEC: Returned 3 results
[0]: OK
[1]: OK
[2]: OK
GET trans_key1: value1
InTransaction: False
DISCARD: Success
EXISTS discard_key after DISCARD: 0 (should be 0)
[9] Server Operations Test
----------------------------------------
PING: PONG
INFO server: (first 100 chars) # Server
redis_version:8.2.3
redis_git_sha1:00000000
redis_git_dirty:1
redis_build_id:c978de5219...
INFO: 6373 bytes
[10] Database Switching Test
----------------------------------------
Current DbIndex: 0
SELECT 1: Success
DbIndex: 1
GET db1_key: in_database_1
SELECT 0: Success
DbIndex: 0
EXISTS db1_key in db0: 0 (should be 0)
[11] Properties Test
----------------------------------------
Host: dbserver.cc
Port: 9736
Connected: True
DbIndex: 0
Timeout: 5
InTransaction: False
InPipeline: False
[12] Error Handling Test
----------------------------------------
GET nonexistent_key_12345: '' (should be empty)
DEL nonexistent_key_12345: 0 (should be 0)
[13] Cleanup Test Data
----------------------------------------
[14] Disconnect
----------------------------------------
Connected after Disconnect: False
==========================================
Test Complete!
==========================================Coverage Statistics
| Category | Test Methods | Description |
|---|---|---|
| Connection | 2 | Connect, Disconnect |
| Basic Commands | 5 | Set_, Get_, Del, Exists, Keys, TTL |
| String | 4 | Incr, Decr, MGet, Set_ (with 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 |
| Transaction | 4 | Multi, Exec, Discard, InTransaction |
| Server | 2 | Ping, Info |
| Database | 2 | SelectDb, DbIndex |
| Properties | 7 | Host, Port, Connected, DbIndex, Timeout, InTransaction, InPipeline |
| Error Handling | 2 | Get/Del non-existent keys |
| Total | 48 |
Last Updated: 2026-06-16