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

我最近又开始玩 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 test

PASS

2018/08/13 09:23:16 Stopped

ok      github.com/...        0.015s


蝴蝶不菲
浏览 88回答 1
1回答

慕莱坞森

grpcServer.Serve(lis)是一个阻塞调用。所以就像你对 HTTP server 所做的那样go server.ListenAndServe(),你需要在一个 goroutine 中运行它。你能试试看是否go grpcServer.Serve(lis)能让测试通过吗?我不确定你的新 EDIT 表明问题出在听众身上。您可以检查是否net.Listen("tcp", fmt.Sprintf(":%d", serverPort))返回或阻止。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go