You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go自定义Queue适配_test测试文件报错修复及测试编写指南

问题修复方案

1. 测试格式化报错修复

你遇到的Error call has possible formatting directive %v报错是因为混淆了testing包的错误输出方法:

  • t.Error() 直接拼接传入的参数,不支持格式化占位符
  • t.Errorf() 才支持%v、%d这类格式化占位符
    对应TestPop里的错误行把t.Error改成t.Errorf即可:
if v != expect {
    t.Errorf("expected %v but recevied %v", expect, v)
}

2. Queue接口未正确实现的问题

你定义的Queue接口中Push方法签名是Push(key interface{})无返回值,但你写的QueueData的Push方法返回*QueueData,二者签名不匹配,所以QueueData实际没有实现Queue接口。如果需要用到Queue类型,要统一签名:
可以把接口定义调整为和实现一致:

type Queue interface {
    Push(key interface{}) *QueueData
    Pop() interface{}
    Contains(key interface{}) bool
    Len() int
    Keys() []interface{}
}

也可以把QueueData的Push方法去掉返回值,根据你的业务需求选择即可。

3. EvictPolicy函数未声明报错修复

如果是自定义的EvictPolicy函数提示未声明,检查两点:

  • 函数首字母是否大写:跨包调用的函数必须首字母大写才能被导出
  • 函数是否和测试代码在同一个包:同包调用不需要导出,检查拼写是否和定义一致

4. TestPop用例逻辑修正

你当前的测试逻辑中expect的计算有误:大小为5的队列插入9个测试值后,队列内剩余元素是testValues[4:9](即索引4到8的元素),原有expect := testValues[len(testValues)-(q.Len()+1)]计算得到的索引不对,改成如下逻辑即可:

// TestPop validate pop item policy
func TestPop(t *testing.T) {
    size := 5
    q := New(size)

    for _, v := range testValues {
        q.Push(v)
    }
    // 先拿到最终队列的预期元素列表
    expectedElements := testValues[len(testValues)-size:]
    for i := 0; q.Len() > 0; i++ {
        t.Log("current: ", q.Keys())
        v := q.Pop()
        expect := expectedElements[i]
        if v != expect {
            t.Errorf("expected %v but recevied %v", expect, v)
        }
    }
}

5. 其他可优化点

  • Contains方法找到匹配项后可以直接break返回,不用遍历完整个队列,提升效率
  • 空队列Pop返回0的逻辑可以改成返回nil,避免和有效元素0产生歧义
Go单元测试编写基本规范
  • 测试文件必须以_test.go结尾,和被测代码放在同一个包下
  • 测试函数名必须以Test开头,参数必须是*testing.T类型,格式为TestXxx(t *testing.T)
  • 常用测试方法说明:
    • t.Log():打印测试日志,只有测试失败或者加-v参数运行测试时才会显示
    • t.Errorf():打印格式化错误信息,标记测试失败但继续执行后续测试逻辑
    • t.Fatalf():打印格式化错误信息,标记测试失败并立刻终止当前测试函数的执行
    • t.Skip():跳过当前测试,通常用于未完成的测试用例
  • 常用测试命令:
    • 运行当前包所有测试:go test .
    • 运行当前包所有测试并打印详细日志:go test -v .
    • 运行指定测试函数:go test -run=TestEvictPolicy .
    • 查看测试覆盖率:go test -cover .

内容的提问来源于stack exchange,提问作者Panji Tri Wahyudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:24:03