0facebook0twittertはてぶ0オープンソースコミュニティでは多言語にわたる統合テストを容易にするための注力がなされています。Data社のSREです。APIを使用してユーザが自身のテストケース内で使用できるテストに便利なライブラリを公開するtestcontainersの、Go言語版のメンテナでもあります。マイクロサービスの人気と、ビジネスクリティカルでない機能のためのサードパーティのサービス利用によって、モダンなアプリケーションを構築するためのサービス間の統合が大幅に増加しました。最近では、マルチサービスは言うまでもなく、MySQL、キーバリューストアとしてのRedis、MongoDB、Postgress、InfluxDBなどの利用が一般的となりました。これらはすべてデータベース専用であり、アプリケーションの他の部分を構成しています。これらすべての統合ポイントで、それぞれのレイヤーでのテストが必要です。単体テストは、すべての依存関係を模倣し、機能の期待値を設定し、あるべき状態を得るまで繰り返せることから、コードを書くスピードを早めることができます。それだけでは足りません。モックが書いた通りに動作するだけでなく、RedisやMongoDBとの統合やマイクロサービスが、期待通りに確実に動くようにしなければなりません。両方とも重要ですが、両者の違いは多大なるものです。この記事では、オーバーヘッドがとても少ない統合テストをGo言語で書くための、testcontainersの使い方をご紹介します。単体テストを書くのをやめてください、と言っているわけではありませんのでご安心ください!その昔、私がJava開発者になることに興味を抱いていた頃、人気のオープンソーストレーサであるZipkinと、InfluxDBの統合テストを書こうとしたことがありました。結局それは失敗に終わりました。私はJava開発者ではなかったからです。統合テストがどのように書かれたかについては理解することができました。それに夢中になりました。testcontainers-javaZipkinは、トレースの格納と操作を行うUIとAPIを提供しており、これはCassandraをはじめ、インメモリやElasticSearch、そしてMySQL、その他多くのプラットフォームをストレージとしてサポートするものです。すべてのストレージシステムが適切に機能することを検証するために、testcontainers-javaというライブラリを使用します。これは、docker-apiのラッパーで、「テストしやすい」よう設計されています。}}setUpで、コンテナ(今回はRedis)を作成し、ポートを公開することができます。ここから動作中のredisインスタンスとの通信が可能になります。新しいコンテナを起動するたびに、ryukという「サイドカー」が現れます。これは一定期間ごとにコンテナやボリューム、そしてネットワークを削除することでDocker環境をきれいに保つ働きをするものです。コンテナ、ボリューム、ネットワークはテスト内でも削除することができます。次に示すのはZipkinからの例です。これはElasticSearchの統合テストで、ご覧のとおりテストケース内で依存関係をプログラムによって設定することが可能です。}これがプログラムによって行われる、という点が重要です。docker-composeのような外部ソフトウェアに頼る必要がなくなるからです。テスト自身の中から起動することで、オーケストレーションとプロビジョニングがより制御可能となり、テストはより安定するのです。テストを実行する前に、コンテナの準備が完了しているかを確認することもできます。私はJava開発者ではないため、Go言語にライブラリを移植し(すべての機能はまだ開発中です)、現在は主要なtestcontainers/testcontainers-goorganizationに入っています。nginxC.Terminate(ctx)コマンドでコンテナを削除します。ryukを覚えていますか?これは強制コマンドではなく、testcontainers-goがコンテナを適切なタイミングで削除するために利用しています。モジュールJavaライブラリにはmodulesと呼ばれる機能があり、ここではデータベース(mysql、postgress、cassandraなど)またはnginxのようなアプリケーションなど、事前にパッケージングしたコンテナを得ることができます。Go言語版でも類似の機能を開発中で、プルリクエストを送っています。アップストリームの動画からアプリケーションが依存するマイクロサービスを構築したい場合は、この機能が適しています。コンテナ内(本番環境でのアプリケーションの動作により近いと思われます)からアプリケーションの動作をテストしたい場合にも適しています。"mappable-dockerfile/Dockerfile"))現在、私が注力していること現在、私が注力しているものは、Kubernetesクラスタをコンテナ内で起動するための機能を使用する、新しいパッケージング済みコンテナです。ns.GetName())PR67でご確認いただけるとおり、この機能はまだ開発中です。すべてのコーダーの方々へtestcontainersのJava版は初めに開発され、多くの機能を備えています。そのすべてはまだGo言語版には移植されておらず、JavaScript、Rust、.Netなど他のライブラリへも同様です。あなたの使用言語で書かれているものをお試しください。コントリビュートも歓迎です。Go言語では、プログラムによるイメージビルドの方法はありません。Dockerに依存しないデーモンレスなビルダーを得るために、buildkitまたはimgを埋め込むことを考えています。Go言語版で作業する素晴らしい点は、すべてのコンテナ依存のライブラリはすでにGo言語で書かれているため、非常に統合性に優れているということです。これはコミュニティに参加する素晴らしい機会です!もしあなたがフレームワークのテストに情熱を抱いているなら、ぜひコミュニティに参加し、プルリクエストを送ってください。Slackに参加しやり取りをしましょう。試してみようこのライブラリが提供する機能のテイストとパワーについて、みなさんが私と同じくらいワクワクしてくれていることを願います。organizationで、あなたの使用言語が利用可能か確認し、ぜひお試しください!もしあなたの使用言語が使用可能となっていない場合は、自分で書いてみましょう!もしもあなたがGo開発者でコントリビュートしたい場合は、お気軽に@gianarbへ私宛てにお問合せください。LABの情報を逃さずチェックしよう!メールアドレスを登録すると記事が投稿されるとメールで通知します。※登録後メールに記載しているリンクをクリックして認証してください。LABの情報を逃さずチェックしよう!メールアドレスを登録すると記事が投稿されるとメールで通知します。※登録後メールに記載しているリンクをクリックして認証してください。