ホームページ バックエンド開発 Golang Golang での Mock の使用法について話し合う

Golang での Mock の使用法について話し合う

Apr 23, 2023 pm 07:29 PM

Golang は、オープンソースの静的型付けプログラミング言語であり、ますます多くの開発者に歓迎され、愛されています。テストコードを書くとき、モックデータを処理することが必要になることがよくあります。この記事では、Golang でのモックの使用法と、さまざまなシナリオでモック データを処理する方法について詳しく説明します。

1. モッキングが必要な理由は何ですか?

テスト プロセス中に、サードパーティのサービス (API、データベース、メッセージ キュー、等。)。そのためには、モッキング テクノロジーを使用してこれらの依存サービスの応答結果をシミュレートし、テスト コードが独立して迅速に実行できることを確認する必要があります。

さらに、モッキングを使用してコードの境界条件 (入力データが要件を満たさないなどの異常な状況など) をテストし、コードの堅牢性と信頼性を強化することもできます。

2. Golang のモッキング ツール

Golang には多数のモッキング ツールがあり、より人気のあるツールは次のとおりです:

  1. testify: 提供されたモッキングアサーション関数は非常に使いやすいです。これを使用して、データベース、HTTP リクエスト、その他のサービスなどの一般的なデータ ソースと出力をシミュレートできます。
  2. mockery: 比較的言えば、このツールはより軽量です。モックコードを迅速かつ正確に生成でき、ランタイムモッキング機能をサポートします。さらに、モックリーはモック コードを生成する際にテンプレート化された出力をサポートしており、ユーザーによりカスタマイズ可能なオプションを提供できます。
  3. 嘲笑/嘲笑: 上記の嘲笑と比較して、このツールは 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Debian OpenSSLの脆弱性は何ですか Debian OpenSSLの脆弱性は何ですか Apr 02, 2025 am 07:30 AM

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

PPROFツールを使用してGOパフォーマンスを分析しますか? PPROFツールを使用してGOパフォーマンスを分析しますか? Mar 21, 2025 pm 06:37 PM

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

Goでユニットテストをどのように書きますか? Goでユニットテストをどのように書きますか? Mar 21, 2025 pm 06:34 PM

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

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

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

フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? Apr 02, 2025 am 09:12 AM

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

go.modファイルで依存関係をどのように指定しますか? go.modファイルで依存関係をどのように指定しますか? Mar 27, 2025 pm 07:14 PM

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

GOでテーブル駆動型テストをどのように使用しますか? GOでテーブル駆動型テストをどのように使用しますか? Mar 21, 2025 pm 06:35 PM

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

See all articles