为了账号安全,请及时绑定邮箱和手机立即绑定

Go gRPC 服务器使集成测试失败

Go gRPC 服务器使集成测试失败

Go
蝴蝶不菲 2023-03-21 14:30:31
我最近又开始玩 go,目前我的任务是实现一个服务(将运行在 k8s 上),它应该充当 gRPC 服务器。根据要求,目前,为了满足 k8s 上的 readinessProbe,我需要为我的服务实现一个健康检查端点,并且应该对此进行测试:我所做的是:func main() {    server := startHTTPServer()    defer server.Close()    c := make(chan os.Signal, 1)    signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)    <-c    log.Println("Stopped")}func startHTTPServer() *http.Server {    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {        w.WriteHeader(http.StatusOK)    })    server := &http.Server{        Addr: net.JoinHostPort("", strconv.Itoa(livelinessPort)),    }    go server.ListenAndServe()    return server}我按照这篇文章以这种方式进行了测试:func TestMain(m *testing.M) {    flag.Parse()    wg := setup()    result := m.Run()    shutdown(wg)    os.Exit(result)}func shutdown(wg *sync.WaitGroup) {    syscall.Kill(syscall.Getpid(), syscall.SIGINT)    wg.Wait()}func setup() *sync.WaitGroup{    os.Setenv("APP_ENV", EnvTest)    wg := &sync.WaitGroup{}    startMainProcess(wg)    return wg}func startMainProcess(wg *sync.WaitGroup) {    go func() {        wg.Add(1)        defer wg.Done()        main()    }()}func TestK8SHealth(t *testing.T) {    res, err := http.Get("http://:8080/")    if err != nil {        t.Errorf("Unexpected API error: %s", err)        return    }    defer res.Body.Close()    if res.StatusCode != http.StatusOK {        t.Errorf("Unexpected status code: %d", res.StatusCode)        return    }}到目前为止一切顺利:$ go testPASS2018/08/13 09:23:16 Stoppedok      github.com/...        0.015s
查看完整描述

1 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

grpcServer.Serve(lis)是一个阻塞调用。所以就像你对 HTTP server 所做的那样go server.ListenAndServe(),你需要在一个 goroutine 中运行它。你能试试看是否go grpcServer.Serve(lis)能让测试通过吗?

我不确定你的新 EDIT 表明问题出在听众身上。您可以检查是否net.Listen("tcp", fmt.Sprintf(":%d", serverPort))返回或阻止。


查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信