Help us shape the future of Go! Take the 2026 Go Developer Survey

cachetest

package
v0.13.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 18, 2026 License: MIT Imports: 8 Imported by: 1

Documentation

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 清理。

每个子测试覆盖一条必须跨实现一致的语义:

  1. miss_returns_nil_nil 未命中返回 (nil, nil) 且非 error,Exists=false
  2. set_get_roundtrip Set/Get 往返相等;重复 Set 覆盖旧值
  3. set_with_ttl_expiry SetWithTTL 短 TTL 过期后 miss(有界等待)
  4. del_and_delbatch Del/DelBatch 后 miss;对不存在的 key 幂等
  5. get_or_load_backfill 未命中回源回填,source 计数恰 1
  6. null_marker Source (nil,nil) → null 标记防穿透,Del 后重新回源
  7. refresh Refresh 取 source 新值并更新缓存
  8. concurrent_mixed_ops 并发混合读写删无 panic(配合 -race 检测数据竞争)

func RunWithClock added in v0.13.0

func RunWithClock[T any](t *testing.T, c Contract[T], factory ClockFactory[T])

RunWithClock 跑时钟驱动的 TTL 边界场景(4 个子测试,#9——供支持时钟注入的 实现接入,补 Run 真实时间套件覆盖不了的确定性边界):

  1. ttl_expiry_boundary 过期边界语义:SetWithTTL 后推进到过期时刻**仍命中** (expiresAt 为闭边界,After 判定),越过 1ns 即 miss
  2. ttl_zero_never_expires TTL=0(自定义 TTL 传 0)永不过期——推进 100 年仍命中
  3. null_marker_out_of_window Source (nil,nil) 写 null 标记;推进远超空值窗口 后重新回源(source 计数 1→2)
  4. overwrite_resets_expiry 重写刷新过期时刻:原 TTL 已越过、新 TTL 仍在窗内 → 命中新值

Types

type ClockFactory added in v0.13.0

type ClockFactory[T any] func(t *testing.T, source cache.SourceFunc[T], clock *FakeClock) cache.CacheAside[T]

ClockFactory 是支持时钟注入的缓存工厂形态:实现把 clock.Now 路由到 全部 TTL 判定(如 LocalConfig.Now),后台资源由 factory 经 t.Cleanup 清理。 支持空值缓存的实现请配置正值 NullTTL(套件以「远超缺省空值窗口」的推进 验证过窗重源)。

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。

type FakeClock added in v0.13.0

type FakeClock struct {
	// contains filtered or unexported fields
}

FakeClock 是套件提供的假时钟(并发安全;测试内手动推进)。 实现把 clock.Now 注入配置后,场景经 Advance 确定性驱动 TTL 过期—— 无 sleep 无 flake(#9)。

func NewFakeClock added in v0.13.0

func NewFakeClock() *FakeClock

NewFakeClock 创建起点为 2026-01-01T00:00:00Z 的假时钟 (取非零真实量级时刻,避开零值 time.Time 的「无过期」歧义)。

func (*FakeClock) Advance added in v0.13.0

func (c *FakeClock) Advance(d time.Duration)

Advance 把假时钟前进 d。

func (*FakeClock) Now added in v0.13.0

func (c *FakeClock) Now() time.Time

Now 返回当前假时刻(可直接作为 LocalConfig.Now 等注入点)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL