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
相关产品推荐
相关产品推荐

