我想测试一个示例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?
您可以使用net/http/httptest
来完成此类测试。
pb创建处理程序。NewHelloWorldServer
并为其提供服务器实现结构。httptest。使用处理程序的NewServer
。。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