Skip to content

Raft 单测非 hermetic:TestNewRaft 等读到遗留 raft_data 持久化状态导致失败 #107

@NeverENG

Description

@NeverENG

现象

go test ./Raft/ 多个用例稳定失败:

--- FAIL: TestNewRaft       raft_test.go:27: Expected initial term to be 0, got 15
--- FAIL: TestGetState
--- FAIL: TestLeaderAppendsLog
--- FAIL: TestRequestVoteRPC
--- FAIL: TestAppendEntriesRPC

根因

NewRaft 默认从 raft_data 目录 readPersist() 加载持久化状态(currentTerm/votedFor/log)。测试运行目录下存在上一次运行遗留的 raft_data,于是 TestNewRaft 读到 term=15 而非期望的初始 0。测试依赖运行目录的残留状态,不是 hermetic 的(与 config 包 #90 同类问题)。

影响

  • 与存储/网络改动无关,main 上即存在。
  • CI 当前只跑 go vet / go build + 冒烟压测,不跑该单测,故未被拦截;但 go test ./... 本地必红。

可选修复

  1. 测试用 NewRaftWithDataDir(..., t.TempDir()) 注入隔离数据目录(已存在该构造函数)。
  2. 测试 setup/teardown 清理 raft_data。

倾向方案 1:每个用例独立 TempDir,彻底 hermetic。

由 PR #106 开发过程中 go test ./... 发现。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions