【问题标题】:Testing bidirectional rpc on golang在 golang 上测试双向 rpc
【发布时间】:2019-07-09 10:52:37
【问题描述】:

我正在关注一些创建双向 grpc 客户端和服务器的教程。客户端将传递一些值,当服务器上的最后一个最大值更改时,它将以当前最大值响应客户端。最后,我想写一些测试用例,但我没有测试场景的经验,这就是为什么我不确定我是否做对了。

func TestClientConnection(t *testing.T) {

    creds, _ := credentials.NewClientTLSFromFile("../server-cert.pem", "")
    conn, err := grpc.Dial(address, grpc.WithTransportCredentials(creds))
    if err != nil {
        t.Error("Had problem with connection, NOT PASSED")
    }
    defer conn.Close()

    c := proto.NewHerdiusServerClient(conn)

    stream, err := c.CheckMax(context.Background())
    if err != nil {
        t.Error("Had problem with stream, NOT PASSED")
        return
    }

    err = stream.Send(&proto.MaxRequest{Val: int32(10)})
    err = stream.Send(&proto.MaxRequest{Val: int32(12)})
    err = stream.Send(&proto.MaxRequest{Val: int32(13)})
    err = stream.Send(&proto.MaxRequest{Val: int32(9)})

    if err != nil {
        t.Error("Had problem with stream, NOT PASSED")
        return
    }

    return
}

现在当我用go test 测试这个场景时它通过了,但我还想测试是否从服务器端收到了一些东西。

我的第二个问题是,如果我想将此测试拆分到不同的场景,例如检查服务器是否连接或流是否连接,或者它是否收到来自服务器端的响应,我该怎么做?我应该创建另一个类来检索连接和流式传输并用于测试功能吗?

【问题讨论】:

    标签: go grpc


    【解决方案1】:

    创建一个超时时间为context.WithTimeout 的比赛,然后在流上发送您的数据调用Recv。检查您是否在超时内收到任何内容。

    具体取决于此处的协议 - 如果您必须同时发送服务器数据,您可能需要一个 goroutine 到 Recv


    至于您的第二个问题,Go 的哲学是为每个场景提供清晰、明确、可读的测试。如果某些代码重复也没关系。更重要的是,每个单独的测试都是可读和可理解的。在测试非常重复的情况下,应该使用table driven tests,但在你描述的情况下,这对我来说听起来像是单独的测试。

    拥有“构建”功能的测试很有用。一个测试测试连接,另一个连接和发送,另一个连接和发送和接收。这样,当测试失败时,通过单独重新运行它们,您甚至可以在查看测试代码之前快速隔离问题。

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 2012-10-09
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      相关资源
      最近更新 更多