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

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

PHPz
PHPzオリジナル
2023-04-23 19:29:061549ブラウズ

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 までご連絡ください。