文档已经涵盖了测试辅助函数以及如何使用它们。我建议添加关于如何编写测试辅助函数的说明。我想到的两点是:
- 第一个参数始终应该是
t *testing.T
。 - 函数的第一行应该是
t.Helper()
。
这个问题的原因是目前的上下文被指示为函数的第一个参数。我编写的一个测试辅助函数testCtx(t *testing.T, ctx context.Context)
导致了一个lint警告 - 上下文应该始终是第一个参数。我打开了 golang/lint#422 并创建了一个修复 golang/lint#423 ,但由于lint只强制执行EffectiveGo和CodeReviewComments中的内容,因此被拒绝了。
当前的状态是,如果我想要这个函数,我应该声明它为testCtx(ctx context.Context, t *testing.T)
,这对我来说是错误的。
3条答案
按热度按时间ztyzrc3y1#
2.函数的第一行应该是
t.Helper()
。但情况并非总是如此:有时你确实希望从辅助函数内部报告行号,而不是从外部。(这主要取决于函数是实现测试的主体,还是只是进行一些不透明的设置。)
tvokkenx2#
t *testing.T
。我对此也持怀疑态度。上下文的文档表明,上下文应该几乎总是第一个参数。我将“几乎”理解为在函数体中使用新创建的上下文的情况相对较少。并不是说有其他情况下你会将上下文作为除第一个参数之外的其他任何内容传递。将上下文和 t *testing.T 同时传递给测试的情况也是罕见的,因此添加这种可能性似乎多余。对我来说,linter 总是期望上下文是第一个参数似乎更可取。
piv4azn73#
我发现在测试中有很多不需要上下文的函数,这让人感到困惑。上下文可以理解为:
然后有一个使用上下文的异常情况(无论是运行测试还是被测试),如下所示:
我需要重新调整我的阅读方式,而不仅仅是承认存在testing.T,实际上我需要思考它。对我来说,将“几乎总是”部分解释为“除了例外情况之一,即测试中需要一个testing.T参数的函数”会更好。