Golang での Mock の使用法について話し合う
Golang は、オープンソースの静的型付けプログラミング言語であり、ますます多くの開発者に歓迎され、愛されています。テストコードを書くとき、モックデータを処理することが必要になることがよくあります。この記事では、Golang でのモックの使用法と、さまざまなシナリオでモック データを処理する方法について詳しく説明します。
1. モッキングが必要な理由は何ですか?
テスト プロセス中に、サードパーティのサービス (API、データベース、メッセージ キュー、等。)。そのためには、モッキング テクノロジーを使用してこれらの依存サービスの応答結果をシミュレートし、テスト コードが独立して迅速に実行できることを確認する必要があります。
さらに、モッキングを使用してコードの境界条件 (入力データが要件を満たさないなどの異常な状況など) をテストし、コードの堅牢性と信頼性を強化することもできます。
2. Golang のモッキング ツール
Golang には多数のモッキング ツールがあり、より人気のあるツールは次のとおりです:
- testify: 提供されたモッキングアサーション関数は非常に使いやすいです。これを使用して、データベース、HTTP リクエスト、その他のサービスなどの一般的なデータ ソースと出力をシミュレートできます。
- mockery: 比較的言えば、このツールはより軽量です。モックコードを迅速かつ正確に生成でき、ランタイムモッキング機能をサポートします。さらに、モックリーはモック コードを生成する際にテンプレート化された出力をサポートしており、ユーザーによりカスタマイズ可能なオプションを提供できます。
- 嘲笑/嘲笑: 上記の嘲笑と比較して、このツールは Go 言語開発者のニーズにより重点を置いています。コードのテストを容易にする、より柔軟な API を提供します。モック インターフェイス メソッドのサポートに加えて、Mockery は非侵入的な外部依存関係をモックすることもできます。
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









OpenSSLは、安全な通信で広く使用されているオープンソースライブラリとして、暗号化アルゴリズム、キー、証明書管理機能を提供します。ただし、その歴史的バージョンにはいくつかの既知のセキュリティの脆弱性があり、その一部は非常に有害です。この記事では、Debian SystemsのOpenSSLの共通の脆弱性と対応測定に焦点を当てます。 Debianopensslの既知の脆弱性:OpenSSLは、次のようないくつかの深刻な脆弱性を経験しています。攻撃者は、この脆弱性を、暗号化キーなどを含む、サーバー上の不正な読み取りの敏感な情報に使用できます。

この記事では、プロファイリングの有効化、データの収集、CPUやメモリの問題などの一般的なボトルネックの識別など、GOパフォーマンスを分析するためにPPROFツールを使用する方法について説明します。

この記事では、GOでユニットテストを書くことで、ベストプラクティス、モッキングテクニック、効率的なテスト管理のためのツールについて説明します。

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

バックエンド学習パス:フロントエンドからバックエンドへの探査の旅は、フロントエンド開発から変わるバックエンド初心者として、すでにNodeJSの基盤を持っています...

この記事では、go.modを介してGOモジュールの依存関係の管理、仕様、更新、競合解決をカバーすることについて説明します。セマンティックバージョンや定期的な更新などのベストプラクティスを強調しています。

この記事では、GOでテーブル駆動型のテストを使用して説明します。これは、テストのテーブルを使用して複数の入力と結果を持つ関数をテストする方法です。読みやすさの向上、重複の減少、スケーラビリティ、一貫性、および
