コンテンツにスキップ

gRPC テスト

現時点では、Mayhem は gRPC サーバーの_ネイティブ_ テストをサポートしていませんが、 gRPC ゲートウェイを使用した gRPC サーバー テストをサポートしています。 ゲートウェイは protoc プラグインに付属します。 ゲートウェイは gRPC サービス定義を読み取り、 RESTful JSON API を gRPC に変換するリバースプロキシ サーバーを生成します。

gRPC Proxy diagram

このガイドは、gRPC サーバーをテストする手順を説明します。 この方法はどの言語でも使用できますが、ガイドでは go を使用する場合を仮定します。 go 以外を使用しており、他の言語で以下の手順を実行する際に問題があった場合、 ご連絡ください。

動作するサンプル

この手順を実行する動作するサンプルは GitHub にあります。

https://github.com/ForAllSecure/mapi-grpc-example

gRPC-Gateway のインストール

README の 手順に従います。 go および protoc がインストールされている必要があります。

サーバー スタブの生成

次のコマンドは、.proto ファイルからプロキシ スタブを生成します。

protoc -I . --grpc-gateway_out . \
    --grpc-gateway_opt logtostderr=true \
    --grpc-gateway_opt paths=source_relative \
    --grpc-gateway_opt generate_unbound_methods=true \
    your/service/v1/your_service.proto

上記のコマンドは、your/service/v1/your_service.pb.gw.go に ゲートウェイ スタブを生成します。 スタブをインポートしてプロキシを作成します。

プロキシ用エントリポイントの作成

rest-proxy.go にプロキシを記述します。プロキシはポート 8081 で待機し、 gRPC サーバーにリクエストをフォワードします。

package main

import (
  "context"
  "flag"
  "net/http"

  "github.com/golang/glog"
  "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
  "google.golang.org/grpc"

  gw "github.com/your-org/your-project/your/service/v1"
)

var (
  // command-line options:
  // gRPC server endpoint
  grpcServerEndpoint = flag.String("grpc-server-endpoint",  "localhost:10990", "gRPC server endpoint")
)

func run() error {
  ctx := context.Background()
  ctx, cancel := context.WithCancel(ctx)
  defer cancel()

  // Register gRPC server endpoint
  // Note: Make sure the gRPC server is running properly and accessible
  mux := runtime.NewServeMux()
  opts := []grpc.DialOption{grpc.WithInsecure()}
  err := gw.RegisterYourServiceHandlerFromEndpoint(ctx, mux,  *grpcServerEndpoint, opts)
  if err != nil {
    return err
  }

  // Start HTTP server (and proxy calls to gRPC server endpoint)
  return http.ListenAndServe(":8081", mux)
}

func main() {
  flag.Parse()
  defer glog.Flush()

  if err := run(); err != nil {
    glog.Fatal(err)
  }
}

以下の 3 点を変更する必要があります。

  • import の行 "github.com/your-org/your-project/your/service/v1" を プロジェクトおよび前のステップで生成したスタブへのパスに合わせて変更します。
  • gRPC サーバーの URL。上記のコードは、gRPC サーバーが localhost:10990 に インストールされていると仮定しています。
  • gw.RegisterYourServiceHandlerFromEndpoint の呼び出しをサービス名に 合わせて変更します。名前がわからない場合、前のステップで生成したゲートウェイ スタブに関数が存在するはずです。

OpenAPI 仕様の生成

次のコマンドは OpenAPI 仕様を生成します。

protoc -I . --openapiv2_out . \
    --openapiv2_opt logtostderr=true \
    --openapiv2_opt generate_unbound_methods=true \
    your/service/v1/your_service.proto

テスト

  1. gRPC サーバーを起動します。
  2. go run rest-proxy.go を実行してプロキシを起動します。
  3. ターゲットを作成します: mapi target create target-name http://localhost:8081
  4. テストを実行します: mapi run target-name 120 your/service/v1/your_service.openapi.json