Documentation
¶
Overview ¶
Package cachetest 提供 cache.CacheAside[T] 实现的公开契约测试套件。
扩展接入契约 ¶
任何新的 CacheAside 后端(etcd/consul/...)**必须**跑过本套件(Run 全绿, 含 -race)方可接入。套件固化 cache 包接口 godoc 承诺的实现语义—— miss 非 error、(nil, nil) 双关、Set/Get 往返与覆盖、显式 TTL、Del 幂等、 GetOrLoad 回填计数、null marker 防穿透、Refresh 更新、并发安全—— 保证所有后端对调用方行为一致。
用法 ¶
cachetest.Run(t, cachetest.Comparable[int](),
func(t *testing.T, source cache.SourceFunc[int]) cache.CacheAside[int] {
c := cache.NewLocalCache(cache.LocalConfig[int]{Source: source})
t.Cleanup(func() { _ = c.Close(context.Background()) })
return c
})
设计原则(对齐 ekit-registry/registrymocks 公开测试包先例) ¶
- 值类型无关:Contract 抽象测试值工厂与相等性;Comparable 覆盖 整数/字符串系可比类型,其余类型自定义 Contract
- 生命周期归 factory:套件不假设实现有 Close(接口契约不含生命周期), factory 用 t.Cleanup 自行清理后台资源
- 有界等待:TTL 场景用短 TTL(50ms)+ 固定有界 sleep(120ms 量级) 验证过期,不做无界轮询;极端负载下由量级余量兜底
组织风格:本包只依赖被测接口(github.com/oekit/data/cache)与标准库, 不反向依赖任何具体实现,实现包反向 import 本包跑套件。
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Run ¶
func Run[T any](t *testing.T, c Contract[T], factory func(t *testing.T, source cache.SourceFunc[T]) cache.CacheAside[T])
Run 跑完整契约场景(8 个子测试,任何子测试失败即实现违反契约)。
factory 每个场景调用一次,用套件给定的 source 构造全新被测缓存 (source 的行为——返回值/计数——由各场景闭包控制,factory 原样注入即可); 被测缓存的后台资源由 factory 经 t.Cleanup 清理。
每个子测试覆盖一条必须跨实现一致的语义:
- miss_returns_nil_nil 未命中返回 (nil, nil) 且非 error,Exists=false
- set_get_roundtrip Set/Get 往返相等;重复 Set 覆盖旧值
- set_with_ttl_expiry SetWithTTL 短 TTL 过期后 miss(有界等待)
- del_and_delbatch Del/DelBatch 后 miss;对不存在的 key 幂等
- get_or_load_backfill 未命中回源回填,source 计数恰 1
- null_marker Source (nil,nil) → null 标记防穿透,Del 后重新回源
- refresh Refresh 取 source 新值并更新缓存
- concurrent_mixed_ops 并发混合读写删无 panic(配合 -race 检测数据竞争)
Types ¶
type Contract ¶
type Contract[T any] struct { // NewValue 返回第 i 个测试值(i 从 0 递增)。 // 实现必须保证任意 i != j 时两值两两不同(套件依赖此性质断言覆盖与刷新)。 NewValue func(i int) *T // Equal 判断两个值是否相等。 // 实现必须容忍 nil 入参(miss 场景会拿 nil 与期望值比较)。 Equal func(a, b *T) bool }
Contract 定义被测缓存的价值工厂与相等性。
通过 Contract 抽象,套件对任意值类型 T 复用同一组场景; 可比较类型可直接用 Comparable 获得现成实现。
func Comparable ¶
func Comparable[T comparable]() Contract[T]
Comparable 返回可比较类型的现成 Contract。
NewValue 经反射按类型枚举生成第 i 个值:
- 有符号/无符号整数系:取 i 本身;
- 字符串系:strconv.Itoa(i)。
其他 comparable 类型(bool、struct、指针、channel 等)无法从整数可靠 枚举出两两不同的值,请自定义 Contract。