当前位置: 首页 > 知识库问答 >
问题:

使用TWIRP开发的测试RPC服务

慕学海
2023-03-14

我想测试一个示例Twirp RPC服务。示例服务来自Twirp官方网站

PROTOBUF定义如下:

syntax = "proto3";

package helloservice;
option go_package = "helloservice";

service HelloWorld {
  rpc Hello(HelloReq) returns (HelloResp);
}

message HelloReq {
  string subject = 1;
}

message HelloResp {
  string text = 1;
}

服务器实现:

type HelloWorldServer struct{}

func (s *HelloWorldServer) Hello(ctx context.Context, req *pb.HelloReq) (*pb.HelloResp, error) {
    return &pb.HelloResp{Text: "Hello " + req.Subject}, nil
}

我尝试了这里建议的解决方案,但在ClientConn与HTTPClient中存在一些混淆。到目前为止,我有这个

var Once sync.Once
const bufSize = 1024 * 1024
var listener *bufconn.Listener

func InitTestServer(t *testing.T) *gomock.Controller {
    Once.Do(func(){
        listener = bufconn.Listen(bufSize)
        server := &server.HelloWorldServer{}
        twirpHandler := pb.NewHelloWorldServer(server, nil)
        mux := http.NewServeMux()
        mux.Handle(twirpHandler.PathPrefix(), twirpHandler)
        httpServer := http.Server{
            Handler: mux,
        }
        go func() {
            if err := httpServer.Serve(listener); err != nil {
                if err != http.ErrServerClosed {
                    log.Fatalln("Failed to start http listener", "error", err)
                }
            }
        }()
    })
    ctrl := gomock.NewController(t)
    return ctrl
}

func bufDialer(context.Context, string) (net.Conn, error) {
    return listener.Dial()
}

func TestCreate(t *testing.T) {
    //ctrl := InitTestServer(t)
    InitTestServer(t)
    ctx := context.Background()
    conn, err := grpc.DialContext(ctx, "", grpc.WithInsecure(), grpc.WithContextDialer(bufDialer))
    // conn is of type *ClientConn
    if err != nil {
        t.Fatalf("Failed to dial bufnet: %v", err)
    }
    defer conn.Close()
    //NewHelloWorldJSONClient accepts only HTTPClient
    client := pb.NewHelloWorldJSONClient(conn)
    response, err := client.Hello(ctx, &pb.HelloReq{
        Subject: "sample",
    })
    t.Log(response, err)
}

有没有办法把一个转换成另一个,或者有没有办法测试Twirp RPC?

共有1个答案

唐高卓
2023-03-14

您可以使用net/http/httptest来完成此类测试。

  1. 使用pb创建处理程序。NewHelloWorldServer并为其提供服务器实现结构。
  2. 创建httptest。使用处理程序的NewServer
  3. 使用httptest服务器的pb中的URL。NewHelloWorldJSONClient(或原型,或两者兼而有之)。

举个简单的例子:

package main

import (
    "context"
    "net/http"
    "net/http/httptest"
    "testing"

    pb "github.com/3ventic/twirphelloworld/rpc"
)

// InitTestServer initializes a test server for HelloWorld and returns its address
func InitTestServer() string {
    handler := pb.NewHelloWorldServer(&HelloWorldServer{})
    server := httptest.NewServer(handler)
    return server.URL
}

func TestHello(t *testing.T) {
    url := InitTestServer()
    clients := map[string]pb.HelloWorld{
        "json": pb.NewHelloWorldJSONClient(url, http.DefaultClient),
        "pb":   pb.NewHelloWorldProtobufClient(url, http.DefaultClient),
    }

    for typ, client := range clients {
        t.Run(typ, func(t *testing.T) {
            ctx := context.Background()
            result, err := client.Hello(ctx, &pb.HelloReq{
                Subject: "test",
            })
            if err != nil {
                t.Error(err)
                t.FailNow()
            }
            if result.Text != "Hello test" {
                t.Errorf("result didn't match 'Hello test', was '%s'", result.Text)
            }
        })
    }
}

这里有完整的例子

 类似资料:
  • 状态:一面过,二面预约时间不合适待约二面 一面 2024-05-16 25min ----------------- 1. 介绍项目 2. 如何学习项目用到的技术栈、知识 3. 项目中最大的挑战 4. 上一份实习没有考虑转正吗 5. 项目对于个人成长 6. 有做测试吗 7. 之前有了解过测试吗 8. 毕设项目用什么技术栈?答辩通过了吗? 9. 手撕简单题 10. 兴趣爱好 11. 反问 总结:没有

  • 前言: 目前0offer  10.13号投简历  10.14号笔试, 3道算法,印象中难度不大  10.17号一面 35min左右  1.自我介绍  2.项目介绍  主要是算法相关的,跟测试没关系,不过也认真听了,问了下具体做的什么工作。  3.为什么选择测开  没算法岗了  4.tcp和udp区别和应用场景  必考?基本都有这题  5.Linux下查看进程 ps,pgrep,top  6.查看内

  • 一面 (有点像kpi面)     自我介绍     手撕(给定一个数组和target,在数组中找出所有加起来等于target的若干数的组合(可以是一个数,两个数,三个数...)。面试官让用动态规划,我不会,用了暴力,破解了部分)     osi模型有哪些,每层的工作,每层的协议有哪些     你常用的linux命令     查看端口是否被占用的linux指令     会用数据库吗,程度?     

  • 10.19 一面内容: 0.自我介绍 1.手撕代码, int 转 Ipv4 字符串 2.分布式系统设计。 使用3000多台服务器实时信息,包括cupinfo memoryinfo等...,设计一个可扩展的,实时监测并预测服务器故障的系统。 10.20 二面 无自我介绍 1.手撕代码, 记不住题目,有点长 2.介绍一个最拿得出手的项目 3.深挖项目,大部分都答不出来: (1.编译为dll过程踩过的坑

  • 1、自我介绍,主要介绍项目 2、你认为你在做自动化测试中遇到最难的问题 3、介绍一下自动化测试框架的优缺点 4、写代码时,你是如何解决报错的问题。 5、bug如何定位 6、三道编程题,第一个字符串倒序 (会问优化算法,暴力法不行),第二个,找单链表第k个节点数,第三个(让手撕,找字符串中子串的个数) 7、一个局域网中用户进行通信,需要用什么类型的协议,以及原因。#测试##深信服面试##深信服#

  • Flex提供RPC服务以向客户端提供服务器端数据。 Flex为服务器端数据提供了相当大的控制。 使用Flex RPC服务,我们可以定义要在服务器端执行的用户操作。 Flex RPC Sservices可以与任何服务器端技术集成。 其中一个Flex RPC服务提供内置支持,可以通过线路传输压缩二进制数据,速度非常快。 Flex提供以下三种类型的RPC服务 S.No RPC服务和描述 1 HttpSe