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

使用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)
            }
        })
    }
}

这里有完整的例子

 类似资料:
  • 前言: 目前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、一个局域网中用户进行通信,需要用什么类型的协议,以及原因。#测试##深信服面试##深信服#

  • 测试开发一面  2022.10.13 全程35min 自我介绍 问了简历里面深度学习和机器学习的项目(问了好一会,奇怪为什么这么感兴趣我做的算法,面试官还知道最大似然估计和交叉熵) 会哪些语言,Java怎么样,接着手撕题目 手撕代码:回文数 (不准用数字转字符串)轻松A掉 showmebug真难用,莫名报错 就问了个OSI-四层是哪一层,有什么协议,UDP协议是干啥的,有什么特点? 反问:多久给结

  • 线下面试,位置在哪就不说了,总共面了50分钟,面试官人不错,就是我太拉了没发挥好。 1.介绍一下自己(带了两份简历,面试官一份我一份,我直接看着简历自我介绍)。 2.平常用什么语言,怎么学习一门新语言? 3.实习中你负责的主要工作内容 4.你在公司中经常用什么测试工具?还了解其他测试工具吗? 5.说一下测试的整体流程 6.你在实习过程中对公司有什么贡献? 7.实习过程中你最有成就感的是什么? 在实