Golang は、オープンソースの静的型付けプログラミング言語であり、ますます多くの開発者に歓迎され、愛されています。テストコードを書くとき、モックデータを処理することが必要になることがよくあります。この記事では、Golang でのモックの使用法と、さまざまなシナリオでモック データを処理する方法について詳しく説明します。
1. モッキングが必要な理由は何ですか?
テスト プロセス中に、サードパーティのサービス (API、データベース、メッセージ キュー、等。)。そのためには、モッキング テクノロジーを使用してこれらの依存サービスの応答結果をシミュレートし、テスト コードが独立して迅速に実行できることを確認する必要があります。
さらに、モッキングを使用してコードの境界条件 (入力データが要件を満たさないなどの異常な状況など) をテストし、コードの堅牢性と信頼性を強化することもできます。
2. Golang のモッキング ツール
Golang には多数のモッキング ツールがあり、より人気のあるツールは次のとおりです:
3. モッキングに testify を使用する
以下では、testify をモッキング ツールとして使用し、例を使用してモッキング テクノロジを使用してコードをテストする方法を示します。
次の関数は外部 HTTP API に依存してデータを取得すると仮定します:
func getOrderDetail(orderID int) (OrderDetail, error){ resp, err := http.Get("https://api.example.com/order/"+strconv.Itoa(orderID)) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("getOrderDetail API returns error status code: %d", resp.StatusCode) } var orderDetail OrderDetail return orderDetail, json.NewDecoder(resp.Body).Decode(&orderDetail) }
この関数をテストするには、HTTP リクエストをモックする必要があります。 testify は、HTTP リクエストのモックを実装するために、MockHTTPServer と RoundTripper という 2 つのメソッドを提供します。
まず、MockHTTPServer の使用方法を見てみましょう:
func TestGetOrderDetail(t *testing.T) { // 创建一个mock server server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 按照需要返回数据 if r.URL.Path == "/order/123" { fmt.Fprintln(w, "{\"orderID\":123,\"createDate\":\"2021-01-01\"}") } else { http.Error(w, "not found", http.StatusNotFound) } })) defer server.Close() // 将http client的请求地址指向mock server oldClient := http.DefaultClient http.DefaultClient = server.Client() defer func() { http.DefaultClient = oldClient }() // 调用 getOrderDetail() 函数 orderDetail, err := getOrderDetail(123) // 对 getOrderDetail() 的返回结果进行断言 assert.Nil(t, err) assert.Equal(t, 123, orderDetail.OrderID) // 假设OrderDetail中包含了字段 OrderID // 按照需要进行其他断言 }
この例では、httptest.NewServer() メソッドを使用してモック サーバーを作成し、その中でシミュレートします。 handlerFunc() HTTPリクエストのレスポンスとステータスコードを返します。
次に、http.DefaultClient がモック サーバーを指すようにして、テスト中に getOrderDetail() が呼び出されたときに、モック サーバーにリクエストを送信できるようにします。
最後に、testify のアサーション メソッドを使用して返された結果をチェックし、関数が正しいことを確認します。
MockHTTPServer に加えて、testify は HTTP リクエストをモックする RoundTripper メソッドも提供します。このメソッドは、HTTP リクエストをシミュレートするためのより柔軟で制御可能な方法を提供します。ユーザーは、RoundTripper の実装をカスタマイズして、いつでもモック データ ソースに切り替えて、テスト プロセスをより適切に制御できます。このメソッドの使用方法の詳細については、testify 公式ドキュメントを参照してください。
4. 嘲笑するために嘲笑を使用する
証言に加えて、嘲笑するために嘲笑を使用することもできます。 Mockery は、言語の組み込みモック ライブラリ (http://golang.org/pkg/mock/) に基づいており、再利用可能なモック コードのフレームワークを生成できるコード生成ツールを提供します。 Mockery はインターフェイスおよび外部依存関係のモック コードの生成をサポートしています。以下では、インターフェイス モードの Mocking を例として紹介します。
まず、モック生成ツールをインストールする必要があります:
go get github.com/vektra/mockery/v2/.../
次に、インターフェイスを定義し、それにメソッドを追加します:
type OrderDetailFetcher interface { FetchOrderDetail(orderID int) (OrderDetail, error) }
次に、ルート ディレクトリに次に、次のコマンドを実行してモック コードを生成します。
mockery --name OrderDetailFetcher
これにより、「mock_orderdetailfetcher.go」という名前のファイルが自動的に生成されます。このファイルには、自動生成されたモック コードが既に含まれています。このモック コードを任意のコードで使用して、インターフェイスのモック データを実装し、テスト タスクを完了できます。
最後に、モックを使用してモッキング コードを生成する方法を示す具体的な例を示します。
type OrderDetail struct { OrderID int CreateDate string } type OrderDetailFetcher interface { FetchOrderDetail(orderID int) (OrderDetail, error) } func GetOrderDetail(fetcher OrderDetailFetcher, orderID int) (OrderDetail, error) { orderDetail, err := fetcher.FetchOrderDetail(orderID) if err != nil { return OrderDetail{}, err } return orderDetail, nil }
この例では、「OrderDetailFetcher」という名前のインターフェイスを定義し、GetOrderDetail() 関数は次のとおりです。これを実装するには、OrderDetailFetcher インターフェイスの FetchOrderDetail() メソッドを使用して注文の詳細を取得する必要があります。モックリー コマンドを使用して、FetchOrderDetail() メソッドのモック コードを自動的に生成できます。
mockery --name OrderDetailFetcher
このコマンドは、現在のディレクトリに「mock_orderdetailfetcher.go」という名前のファイルを生成します。このファイルには、自動生成されたモック コードが含まれています。 . .機能テスト タスクを完了するには、モック コードとテスト コードを組み合わせるだけです。
func TestGetOrderDetail(t *testing.T) { orderDetail := OrderDetail{OrderID: 123, CreateDate: "2021-01-01"} // 创建一个mock对象 mockOrderDetailFetcher := &mocks.OrderDetailFetcher{} // 设定mock对象的mock调用及对应的返回结果 mockOrderDetailFetcher.On("FetchOrderDetail", 123).Return(orderDetail, nil) // 调用GetOrderDetail()函数 result, err := GetOrderDetail(mockOrderDetailFetcher, 123) // 校验返回结果及错误码 assert.Nil(t, err) assert.Equal(t, orderDetail, result) }
この例では、mockOrderDetailFetcher オブジェクトを定義し、モック ライブラリの On() メソッドを使用して、その FetchOrderDetail() メソッドの特定の呼び出しルールと対応する結果を指定します。orderID が 123 の場合、 orderDetail オブジェクトが返されます。テストコードは、mockOrderDetailFetcher の FetchOrderDetail(123) を取得するときに、事前設定された orderDetail オブジェクトを直接返します。最後に、testify のアサーション メソッドを使用して結果を検証します。
要約
この記事では、Golang のモッキングに関する関連知識と一般的なモッキング ツール、さらに testify ツールとモックツールを使用してモッキング操作を実行し、ターゲット関数のモック テストを完了する方法を紹介します。モッキング テクノロジーを合理的かつ正しく適用することで、コードの可読性、堅牢性、信頼性などの側面を向上させることができます。同時に、モッキングは、さまざまなコードで起こり得る問題を迅速に特定して解決し、テスト コードのカバレッジと精度を向上させるのにも役立ちます。
以上がGolang での Mock の使用法について話し合うの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。