微服务单元测试之rpc

878 阅读4分钟

做任何项目,单元测试,都重要,非常!

基于微服务的项目亦不例外!

实际上微服务项目较一般单体项目,更易实施单元测试。

单体项目中,由于很多时候项目的各个组成部分之间耦合性较大,单元测试往往也会牵扯众多,最终导致出现问题时相对排查困难!

而微服务项目中,系统已经按尽可能小的粒度拆分为一个个微型模块,模块间不互相调用对方的函数,也不直接操纵对方的数据!

每个微服务都接收输入(或没有输入),并返回处理结果,这在做单元测试时,有莫大的好处,因为边界明淅,每个服务的测试都只需要聚焦自身。

我们在做微服务时,通常会将每个服务的最底层做成rpc服务并注册到服务发现系统如etcd或consul中!随后我们会封装一个基http协议的api,该api根据服务发现系统中注册的信息来访问到实际的rpc服务上!最后再通过nginx网关或k8s来将所有的api打包同一个域名及端口下!架构如下图所示!

image.png

我们在做api层测试时,有大量的接口工具可用,如postman、apipost、apifox。

然后此类工具对rpc服务支持得并不是很好!本文旨在说明如何进行rpc服务的测试!

由于本专档主要focus在go语言开发微服务上(其实主要是87v5我这个乡野村夫实在搞不赢驾驭不了java等高级语言)。

下面按go语言如何做rpc服务的单元测试进行简要介绍,主要分为传统测试方法和基于Goland的测试方法。

一、 传统测试方法

快速浏览完本文档的同学可能会问:“村夫哥,你的方法2非常好用了,为什么还要介绍方法1呢?还有必要么?”

我们都知道JetBrains的全家桶好用,但是:

  1. 全家桶是收费的,有木有。虽然有各种途径可以获得免费的授权,但也不是每一个人都能获得授权不是?
  2. 有时候我们不具备使用图形环境的条件,虽然说goland的授权里有支持remote开发的。
  3. 还有,有些同学就是单纯的喜欢vscode写代码。
  4. 甚至更有些同学就是喜欢vim和emacs。

总之,就是,虽然村夫本人在有了Goland之后也不愿意去写单元测试代码,但是,技多不压身。多会一门手艺总是好的(此时仿佛听到“呸,你怎么不去学好Java”)。

言归正传,下面讲干货:

1. 编写测试用例

在代码单元下新建测试代码目录test,如下图所示
image.png 新建main程序test.go,其代码如下

package main

import (
   "context"
   "flag"
   "fmt"
   "google.golang.org/grpc"
   "toongfunois/service/user/rpc/types/user"
)

var configFile = flag.String("f", "etc/user.yaml", "the config file")

func main() {
   conn, err := grpc.Dial("127.0.0.1:9000", grpc.WithInsecure())
   if err != nil {
      fmt.Println("Failed to connect rpc server: " + err.Error())
   }

   defer conn.Close()

   client := user.NewUserClient(conn)

   req := user.LoginRequest{
      Account:  "tf001",
      Password: "123456",
   }

   resp, err := client.Login(context.Background(), &req)
   if err != nil {
      fmt.Println("Failed to call login service: " + err.Error())
   }

   fmt.Println(resp)

}

  代码中user.NewUserClient(conn)是来自于go-zero创建出来的用户微服务的接口。其它工具创建出来的代码或是手工撸出来的代码类似。

2.运行测试代码进行单元测试

如果您在使用Goland,点击如下图所示的func main()前面的运行图标,即可运行测试程序。 image.png

如果你没有使用Goland,您可以在命令行中运行

go run test.go

在您的Goland的Run窗口或是您运行程序的命令行输出中,将得到rpc接口的反馈值。

image.png

二、基于JetBrains全家桶之Goland测试

原来我是不知道使用这个方法的,此方法系由微信群“go-zero社区22”中的当代兄弟那学来。

af8539b3f53f281ef8f5e9066f3ba9ad_1.jpg“go-zero社区22”中的当代兄弟

要使用这个快捷的方法,您需要确保您的Goland中如下图所示的红、蓝Buff都已经加上。

1677215175228.png

打开rpc服务的.proto文件,如本示例中为user.proto。点击如下图所示的"Generate request in HTTP"图标。
1677215801210.png

做个简单选择系统将自动为您生成generated-requests.http image.png

根据您自己的实际情况,对该文件做简单修改,比如村夫的rpc工作在本机的9000端口上,再填上相应的参数。如下图所示
image.png

点击前面的绿色运行图标,将启动rpc代码的单元测试。测试结果同样出现在Run窗口中。
image.png

结语

以上是本人总结的rpc单元测试的常规方法,以及基于Goland的快捷测试方法。

最后再次感谢“当代”哥!

欢迎转载,转载请注明出处及原文链接! 谢谢!