如何解决在执行并行表测试用例时,如何推迟测试服务器的关闭?
在执行并行表测试功能时,我无法推迟测试http服务器的关闭。我正在尝试使用sync.WaitGroup
,但是wg.Done()
要么关闭得太早,要么从未发生。
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter,r *http.Request) {
w.WriteHeader(http.StatusOK)
_,_ = w.Write([]byte(`hello`))
}))
defer ts.Close()
var wg sync.WaitGroup
for _,tc := range testCases {
wg.Add(1)
func(tc testCase) {
// `Done` here doesn't wait for the test to run,so closes the test server early
// defer wg.Done()
t.Run(tc.name,func(t *testing.T) {
// `Done` here is never called,so causes a timeout
// defer wg.Done()
t.Parallel()
_,err := http.Get(ts.URL)
if err != nil {
t.Fatal(err.Error())
}
})
}(tc)
}
wg.Wait()
有关可运行示例,请参见https://play.golang.org/p/1GvWRwlrsjA
解决方法
这很可能是因为t.Run()
在其主体内部使用时不会阻塞。将t.Parallel()
个测试用例包装到非并行组中可以解决该问题:
t.Parallel()
编辑:我在Golang repo Issues中发现了此参考,该参考暗示了相同的问题:https://github.com/golang/go/issues/17791
,如果您使用的是1.14或更高版本,建议您在测试后使用T.Cleanup
进行清理任务。另外,您是否有任何理由不想为每个子测试使用新服务器?使用共享服务器意味着您失去了子测试隔离。
Cleanup注册一个在测试及其所有功能时要调用的函数 子测试完成。清理函数将在最后添加的函数中调用, 首先被称为订单。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。