この記事では、MongoDB 用の C# Testcontainers について説明します。データベースのスピンアップや破棄に伴うオーバーヘッドの管理や、クラウドで何かを管理することについて考えたくない場合は、ローカル データベースの作業に Testcontainers を使用するのが好きです。 MongoDB も例外ではありません。MongoDB 用に用意されている C# Testcontainers NuGet パッケージは、夢のような作業です。
この記事では、Testcontainer の基本について紹介します。ここからは、C# MongoDB.Driver NuGet パッケージを介して新しく作成したデータベースと対話することがいかに簡単であるかを示します。コンテナーがスピンアップされたことさえ気づかないほどです。それでは、詳しく見ていきましょう。
Testcontainers は、.NET アプリケーションを構築する際のテストとローカル開発のワークフローを大幅に強化できる素晴らしい NuGet パッケージです。これは、Docker コンテナを管理するためのシンプルかつ効果的な方法を提供し、軽量で分離されたインスタンスをスピンアップし、何事もなかったかのように破棄できるようにします。
つまり、Testcontainers を使用すると、テスト データベースのセットアップと破棄、または複雑な構成ファイルの処理について心配する必要がなくなります。コンテナー管理のすべての詳細を処理するため、このプロセスは簡単に感じられます。これを手動で処理したくないはずです。
Testcontainers の主な利点には次のようなものがあります。
この記事では、特に MongoDB で C# Testcontainers を使用する方法に焦点を当てます。ここで説明するアドバイスの多くは他のサービス、特にデータベースにも当てはまりますが、引き続き MongoDB に注目していきます。
C# で Testcontainers の使用を開始するには、プロジェクトに必要な依存関係をインストールして構成する必要があります。 C# で MongoDB の Testcontainers をセットアップするには、以下の手順に従います。
通常、最初のステップは、C# プロジェクトに Testcontainers NuGet パッケージをインストールすることです。 NuGet パッケージ マネージャー コンソールを開き、次のコマンドを実行します。
Install-Package Testcontainers
ただし、基本的な Testcontainers パッケージを含むこのパッケージの MongoDB フレーバーが必要です (執筆時点ではバージョン 3.8.0 を使用しています)。パッケージ マネージャーのユーザー インターフェイスまたは次のコマンドを使用してインストールできます。
Install-Package Testcontainers.MonogoDB
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 にバインドします。ポートをバインドする特別な必要がない限り、潜在的にこれをそのままにしておくことができることが次のセクションでわかります。動的な接続文字列を取得できるのでとても便利です。
MongoDB 用の Testcontainers を構成した後、必要に応じてコンテナーを起動および停止できます。コンテナーを開始および停止するためのコード例を次に示します。
MongoDB コンテナを起動するには:
await container.StartAsync();
MongoDB コンテナを停止するには:
await _container.StopAsync();
MongoDbContainer 型は破棄できるので、準備ができたらDisposeAsync
呼び出してクリーンアップしてください。
コンテナーをスピンアップおよび破棄する方法を確認しましたが、コンテナーをどうすればよいでしょうか?私たちにはたくさんのオプションがありますが、実際、限界はあなた自身の想像力 (そして時間、お金、その他のリソース…) です。
ほとんどの人は、統合テストまたは機能テストを作成するために C# テストコンテナを利用します。たとえば、Testcontainer を xUnit または NUnit と組み合わせて、実際のデータベースと対話するテストを作成できます。
私の場合は、 MongoDB へのレコード挿入のベンチマークを実行できるように、MongoDB 用の C# テストコンテナーを BenchmarkDotNet に接続する必要がありました。同様の使用例では、一時的なローカル データベースが必要でしたが、必ずしもテスト フレームワーク用ではありませんでした。
いずれにしても、C# からこれらの MongoDB データベース コンテナーに接続できる必要があります。これについては次のサブセクションで説明します。
前のセクションを読み、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 テストコンテナがセットアップされ、それに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# Testcontainers は、テストと開発のために一時的な MongoDB データ ストアを立ち上げて実行するための非常に簡単な方法です。この記事は特定の使用例には焦点を当てていませんでしたが、Testcontainers の上に MongoDB ドライバーを重ねて MongoDB と対話することがいかに透過的であるかをより深く理解できたでしょうか。
C# Testcontainers を使用すると、セットアップ、破棄、さらには接続文字列の管理にかかる煩雑な作業が軽減されるため、ローカルで使用するために MongoDB を立ち上げて実行したい場合には、これが私からの簡単な推奨事項となります。
これが役立つと思われ、さらに学習の機会を探している場合は、私の無料の毎週のソフトウェア エンジニアリング ニュースレターの購読を検討してください。また、 YouTube で私の無料ビデオをチェックしてください。
ここでも公開されています