【发布时间】:2020-12-25 03:25:31
【问题描述】:
我正在使用调用函数的 API 开发 Web 服务器。此函数执行繁重的工作并缓存结果。我的设计方式是,如果没有缓存并且多个用户同时使用相同的参数调用此 API,则服务器只为第一个请求调用该函数一次,所有其他请求等待完成工作和从缓存返回响应。
我用这种方式为它写了一个测试:
func TestConcurentRequests(t *testing.T) {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
// do the request
wg.Done()
}
}
wg.Wait()
}
我可以通过在该繁重函数中打印一个值来检查我的代码是否正常工作,并检查控制台以查看它是否只出现一次,但我正在寻找一种方法使测试失败,如果此函数已被调用更多次。像这样的:
if n := NumberOfCalls(MyHeavyFunction); n > 1 {
t.Fatalf("Expected heavy function to run only once but called %d times", n)
}
【问题讨论】:
-
通常情况下,您可能应该不测试一个函数被调用了多少次。相反,您应该检查它是否产生了您期望的输出。理论上,应该可以重构代码,使函数被调用更多次,或者更少(可能为0次)。如果发生这种情况,并且代码仍然正常运行,则测试应该通过。换句话说:大多数检查函数执行次数的测试实际上是在测试错误的东西。