在Golang上测试双向RPC

时间:2019-02-15 10:05:12

标签: go grpc

我正在遵循一些教程来创建双向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测试此方案时,它通过了,但是我还想测试是否从服务器端收到了某些信息。

我的第二个问题是,如果我想将此测试分解到不同的情况下,例如检查服务器是否连接或流连接或是否收到服务器端的响应,我该怎么做?我是否应该创建另一个类来检索连接和流传输并在测试功能上使用?

1 个答案:

答案 0 :(得分:0)

创建一个具有超时context.WithTimeout的比赛,并在流上发送数据呼叫Recv之后。检查是否在超时时间内收到任何消息。

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


关于您的第二个问题,Go的原则是针对每种情况进行清晰,明确,易读的测试。复制某些代码就可以了。更重要的是,每个单独的测试都是可读和可理解的。在测试非常重复的情况下,应该使用table driven tests,但在您描述的情况下,对我来说这听起来像是单独的测试。

进行具有“构建”功能的测试很有用。一个测试用于测试连接,另一个测试用于连接,并且发送,另一个测试用于发送和接收。这样,当测试失败时,通过单独重新运行它们,甚至可以在查看测试代码之前就非常快速地找出问题所在。