paint-brush
MongoDB 用の C# Testcontainers を使用してローカル データベースを簡単に実行する@devleader
273 測定値

MongoDB 用の C# Testcontainers を使用してローカル データベースを簡単に実行する

Dev Leader7m2024/04/02
Read on Terminal Reader

長すぎる; 読むには

この記事では、Testcontainer の基本について紹介します。ここからは、C# MongoDB.Driver NuGet パッケージを介して新しく作成したデータベースとやり取りすることがいかに簡単であるかを説明します。まるでコンテナーがスピンアップされていることに気づかないほどです。では、詳しく見ていきましょう。
featured image - MongoDB 用の C# Testcontainers を使用してローカル データベースを簡単に実行する
Dev Leader HackerNoon profile picture
0-item

この記事では、MongoDB 用の C# Testcontainers について説明します。データベースのスピンアップや破棄に伴うオーバーヘッドの管理や、クラウドで何かを管理することについて考えたくない場合は、ローカル データベースの作業に Testcontainers を使用するのが好きです。 MongoDB も例外ではありません。MongoDB 用に用意されている C# Testcontainers NuGet パッケージは、夢のような作業です。


この記事では、Testcontainer の基本について紹介します。ここからは、C# MongoDB.Driver NuGet パッケージを介して新しく作成したデータベースと対話することがいかに簡単であるかを示します。コンテナーがスピンアップされたことさえ気づかないほどです。それでは、詳しく見ていきましょう。


C# テストコンテナの概要

Testcontainers は、.NET アプリケーションを構築する際のテストとローカル開発のワークフローを大幅に強化できる素晴らしい NuGet パッケージです。これは、Docker コンテナを管理するためのシンプルかつ効果的な方法を提供し、軽量で分離されたインスタンスをスピンアップし、何事もなかったかのように破棄できるようにします。


つまり、Testcontainers を使用すると、テスト データベースのセットアップと破棄、または複雑な構成ファイルの処理について心配する必要がなくなります。コンテナー管理のすべての詳細を処理するため、このプロセスは簡単に感じられます。これを手動で処理したくないはずです。


Testcontainers の主な利点には次のようなものがあります。

  • 一貫した再現可能なテスト環境を提供する機能。必要なサービスの正確なバージョンと構成を定義できるため、さまざまな環境にわたってテスト結果の信頼性と一貫性が保証されます。


  • テストと開発のワークフローにスピードと柔軟性をもたらします。軽量の Docker コンテナを使用すると、オンデマンドでテスト環境を迅速に起動および破棄できます。クラウドや共有リソースを事前に構成する必要はありません。その場ですぐに使用できます。


  • Xunit、NUnit、BenchmarkDotNet など、DotNet エコシステム内の既存のテスト フレームワークおよびツールとのシームレスな統合。これにより、大きな変更を加えることなく、コンテナ化されたサービス インスタンスを既存のテスト スイートに簡単に組み込むことができます。


この記事では、特に MongoDB で C# Testcontainers を使用する方法に焦点を当てます。ここで説明するアドバイスの多くは他のサービス、特にデータベースにも当てはまりますが、引き続き MongoDB に注目していきます。


C# でのテストコンテナのセットアップ

C# で Testcontainers の使用を開始するには、プロジェクトに必要な依存関係をインストールして構成する必要があります。 C# で MongoDB の Testcontainers をセットアップするには、以下の手順に従います。

1. テストコンテナのインストール

通常、最初のステップは、C# プロジェクトに Testcontainers NuGet パッケージをインストールすることです。 NuGet パッケージ マネージャー コンソールを開き、次のコマンドを実行します。

 Install-Package Testcontainers


ただし、基本的な Testcontainers パッケージを含むこのパッケージの MongoDB フレーバーが必要です (執筆時点ではバージョン 3.8.0 を使用しています)。パッケージ マネージャーのユーザー インターフェイスまたは次のコマンドを使用してインストールできます。

 Install-Package Testcontainers.MonogoDB

2. MongoDB 用のテストコンテナの構成

Testcontainers をインストールしたら、MongoDB 用に構成する必要があります。これには、必要な設定を使用して MongoDB コンテナーをセットアップすることが含まれます。 C# で MongoDB の Testcontainers を構成する方法の例を次に示します。

 using Testcontainers.MongoDb; MongoDbContainer container = new MongoDbBuilder() .WithImage("mongo:latest") .Build();


上の例では、 MongoDbBuilderの新しいインスタンスを作成し、MongoDB イメージとポート バインディングを指定します。 WithImageメソッドは MongoDB コンテナのイメージを設定するため、「mongo:latest」を使用すると常に最新のイメージがプルされます。


オプションで、ポート バインディングを使用して、使用するポートを明示的に構成できます。

 using Testcontainers.MongoDb; MongoDbContainer container = new MongoDbBuilder() .WithImage("mongo:latest") .WithPortBinding(1337, 27017) .Build();


上記のコードは、 WithPortBindingメソッドを使用して、コンテナーのポート 27017 をホスト マシンのポート 1337 にバインドします。ポートをバインドする特別な必要がない限り、潜在的にこれをそのままにしておくことができることが次のセクションでわかります。動的な接続文字列を取得できるのでとても便利です。

3. MongoDB コンテナの起動と停止

MongoDB 用の Testcontainers を構成した後、必要に応じてコンテナーを起動および停止できます。コンテナーを開始および停止するためのコード例を次に示します。


MongoDB コンテナを起動するには:

 await container.StartAsync();


MongoDB コンテナを停止するには:

 await _container.StopAsync();


MongoDbContainer 型は破棄できるので、準備ができたらDisposeAsync呼び出してクリーンアップしてください。


MongoDB の C# テストコンテナを実際に使用する

コンテナーをスピンアップおよび破棄する方法を確認しましたが、コンテナーをどうすればよいでしょうか?私たちにはたくさんのオプションがありますが、実際、限界はあなた自身の想像力 (そして時間、お金、その他のリソース…) です。


ほとんどの人は、統合テストまたは機能テストを作成するために C# テストコンテナを利用します。たとえば、Testcontainer を xUnit または NUnit と組み合わせて、実際のデータベースと対話するテストを作成できます。


私の場合は、 MongoDB へのレコード挿入のベンチマークを実行できるように、MongoDB 用の C# テストコンテナーを BenchmarkDotNet に接続する必要がありました。同様の使用例では、一時的なローカル データベースが必要でしたが、必ずしもテスト フレームワーク用ではありませんでした。


いずれにしても、C# からこれらの MongoDB データベース コンテナーに接続できる必要があります。これについては次のサブセクションで説明します。

MongoDB.Driver を使用して MongoDB の C# テストコンテナに接続する

前のセクションを読み、Testcontainers 用に正しい MongoDB パッケージがインストールされていると仮定します。このセクションをざっと読んだ場合は、戻って読んで、適切なパッケージを入手してください。そうしないと、なぜ適切な依存関係が見つからないのか頭を悩ませることになります。


MongoDB.Driver NuGet パッケージもインストールする必要があります。これは、スピンアップしたデータベース コンテナーへの接続を確立するために使用するものです。 MongoDB.Driver が一般的にどのように動作するかについてさらに詳しく説明したい場合は、他の記事を参照してください。


適切なパッケージの準備ができたら、前に見たコードを MongoDB ドライバー コードと組み合わせて、物事を結び付けることができます。

 using MongoDB.Bson; using MongoDB.Driver; using Testcontainers.MongoDb; MongoDbContainer container = new MongoDbBuilder() .WithImage("mongo:latest") .Build(); await container.StartAsync(); string connectionString = container.GetConnectionString(); MongoClient mongoClient = new MongoClient(connectionString); IMongoDatabase database = mongoClient.GetDatabase("test"); IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("test");


上の例では、Testcontainers から新しくスピンアップされた MongoDB コンテナ上でGetConnectionString()を呼び出すことができます。これの素晴らしい点は、このコードや記事の前半で見たビルダー パターンを使用して MongoDB 用の Testcontainer をどのように構成しても、 GetConnectionString()接続に必要なものを取得できることです。


MongoClient接続文字列を 1 つの引数として受け取るため、MongoDB データベースにアクセスしてすぐに操作を開始するのは簡単です。

MongoDB テストコンテナでの CRUD 操作の実行

これで、MongoDB テストコンテナがセットアップされ、それにMongoClientが接続されたので、それに対する CRUD 操作の実行を開始できます。コンテナー インスタンスによって提供される接続の詳細により、これら 2 つのことを簡単に組み合わせることができるようになり、CRUD の MongoDB.Driver メソッド呼び出しだけに集中できるようになりました。


単純な CRUD 操作を実行する例を次に示します。

 // using code from earlier examples... // Create await collection.InsertOneAsync(new BsonDocument() { ["Name"] = "Nick Cosentino", }); // Read var filterBuilder = Builders<BsonDocument>.Filter; var filter = filterBuilder.Eq("Name", "Nick Cosentino"); var results = collection.Find(filter); // Update var updateBuilder = Builders<BsonDocument>.Update; var update = updateBuilder.Set("Name", "Dev Leader"); collection.UpdateOne(filter, update); // Delete filter = filterBuilder.Eq("Name", "Dev Leader"); collection.DeleteOne(filter);


前のコード スニペットを使用すると、すでに MongoDB コンテナ インスタンスとMongoClientが起動して実行されていました。その結果、上記のコード スニペットで、前のセットアップで取得したIMongoCollection<BsonDocument>を直接操作できることがわかります。


これは、MongoDB Docker コンテナーを Testcontainers 経由で起動して実行すると、接続後は特別な方法で処理する必要がないことを示しています。


MongoDB 用の C# テストコンテナのまとめ

結論として、MongoDB 用 C# Testcontainers は、テストと開発のために一時的な MongoDB データ ストアを立ち上げて実行するための非常に簡単な方法です。この記事は特定の使用例には焦点を当てていませんでしたが、Testcontainers の上に MongoDB ドライバーを重ねて MongoDB と対話することがいかに透過的であるかをより深く理解できたでしょうか。


C# Testcontainers を使用すると、セットアップ、破棄、さらには接続文字列の管理にかかる煩雑な作業が軽減されるため、ローカルで使用するために MongoDB を立ち上げて実行したい場合には、これが私からの簡単な推奨事項となります。


これが役立つと思われ、さらに学習の機会を探している場合は、私の無料の毎週のソフトウェア エンジニアリング ニュースレターの購読を検討してください。また、 YouTube で私の無料ビデオをチェックしてください。


ここでも公開されています