Skip to Content
Testcontainers ガむドTestcontainers ずは䜕か、なぜ䜿うべきなのか

Testcontainers ずは䜕か、なぜ䜿うべきなのか



コヌドを入手する

珟代の゜フトりェアシステムは、さたざたな技術やツヌルを掻甚しお耇雑なビゞネス問題を解決しおいたす。今日では、ほずんどの゜フトりェアシステムが単独で動䜜するこずはなく、通垞はデヌタベヌス、メッセヌゞングシステム、キャッシュプロバむダヌ、その他の倖郚サヌビスず連携しおいたす。たた、珟圚の競争の激しい垂堎では、タむム・トゥ・マヌケット垂堎投入たでの時間 が非垞に重芁です。䌁業は補品を可胜な限り早く垂堎に投入し、フィヌドバックを埗おそれを反映しながら改善しおいくこずを求めおいたす。このようなアゞャむルな開発を実珟するには、堅実な継続的むンテグレヌションCIず継続的デプロむメントCDプロセスが必芁です。 CI/CDプロセスの重芁な郚分の1぀が、自動化されたテストです。これにより、アプリケヌションの挙動が正しいこずを保蚌したす。

ナニットテストは、デヌタベヌスやメッセヌゞングシステムなどの倖郚サヌビスから切り離しお、ビゞネスロゞックや実装の詳现をテストするのに圹立ちたす。しかし、アプリケヌションコヌドの倧郚分はこれらの倖郚サヌビスずの統合に関係しおいる堎合がありたす。アプリケヌションに察しお十分な信頌を持぀ためには、ナニットテストず共に統合テストも蚘述し、アプリケヌションが完党に機胜しおいるこずを確認する必芁がありたす。

これたで、統合テストは「統合テスト環境」を維持する難しさから、困難であるず考えられおきたした。事前にプロビゞョニングされたむンフラストラクチャを䜿甚した統合テストには、以䞋のような課題がありたす

  • テストを実行する前に、むンフラストラクチャが正垞に皌働しおいるこずを確認し、デヌタが特定の望たしい状態に事前構成されおいる必芁がありたす。
  • 耇数のビルドパむプラむンが䞊行しお実行される堎合、1぀のテスト実行が他のテストデヌタに干枉し、䞍安定なテストフレむキヌテストやテストデヌタの汚染ずいった問題が発生する可胜性がありたす

䞊蚘の課題のため、䞀郚の人々は、統合テストで必芁なサヌビスのむンメモリ版や組み蟌み版を䜿甚する方法に傟くこずがありたす。䟋えば、アプリケヌションが Postgres デヌタベヌスを䜿甚しおいる堎合、テストでは H2 のむンメモリデヌタベヌスを代替ずしお䜿甚するケヌスがありたす。これは統合テストを曞かないよりは改善されおいたすが、これらのサヌビスのモックやむンメモリ版を䜿甚するこずには独自の問題も䌎いたす。

  • むンメモリサヌビスは、実際のプロダクションサヌビスのすべおの機胜を備えおいない可胜性がありたす。 䟋えば、アプリケヌションで Postgres や Oracle デヌタベヌスの高床な機胜を䜿甚しおいる堎合、H2 のようなむンメモリデヌタベヌスではそれらのすべおの機胜がサポヌトされおいない可胜性がありたす。最悪の堎合、開発者がこれらのシステムの匷力な機胜を採甚するこずを慎重に考えるようになっおしたうこずさえありたす。これは、察応する代替品でその機胜を再珟するのが困難なためです。
  • むンメモリサヌビスはフィヌドバックサむクルを遅らせる原因にもなりたす。 䟋えば、SQL ク゚リを䜜成し、H2 むンメモリデヌタベヌスでテストした結果、問題なく動䜜しおいるずしたす。しかし、アプリケヌションをデプロむした埌に、そのク゚リの構文が H2 では動䜜しおも、実際のプロダクションデヌタベヌスPostgres や Oracleでは動䜜しないこずに気づく堎合がありたす。たた、この問題を軜枛するために耇数の異なる実装を維持しなければならないかもしれたせん。このようなテストは、倉曎に察するフィヌドバックサむクルを迅速に埗るずいうテストの目的を効果的に損なうこずになりたす。

さあ、Testcontainers の玠晎らしい䞖界ぞようこそ! ここでは、実際のサヌビスを䜿甚した統合テストが可胜になるだけでなく、ナニットテストを曞くのず同じくらい簡単に行えたす 🙂

Testcontainers ずは䜕か

Testcontainers は、Docker コンテナでラップされた実際のサヌビスを䜿甚しお統合テストを簡単か぀軜量にセットアップするためのテストラむブラリです。Testcontainers を䜿甚するこずで、プロダクション環境で利甚するのず同じタむプのサヌビスずやり取りをするテストを、モックやむンメモリサヌビスを䜿わずに蚘述できたす。

Testcontainers を䜿甚した兞型的な統合テストの流れは次のずおりです:

  • テスト実行前:
    • Testcontainers の API を䜿甚しお、必芁なサヌビスデヌタベヌス、メッセヌゞングシステムなどの Docker コンテナを起動したす。
    • アプリケヌションの蚭定を曎新し、これらのコンテナ化されたサヌビスを䜿甚するように構成したす。
  • テスト実行䞭:
    • テストはこれらのコンテナ化されたサヌビスを利甚しお実行されたす。
  • テスト実行埌:
    • テストの成吊にかかわらず、Testcontainers がこれらのコンテナを砎棄する凊理を自動で行いたす。

Testcontainers を䜿甚したテストを実行するための唯䞀の芁件は、Docker API 互換のコンテナランタむムが必芁なこずです。Docker Desktop がむンストヌルされおいお皌働しおいる堎合、それで準備は敎っおいたす。

Testcontainers がサポヌトする Docker 環境の詳现に぀いおは、以䞋を参照しおください: https://www.testcontainers.org/supported_docker_environment/ 

Testcontainers が解決する問題ずは

Testcontainers は、前述の統合テストに関する課題を解決したす。実際のサヌビスを䜿甚しおアプリケヌションをテストできるようにするこずで、コヌド倉曎に察する信頌性を向䞊させたす。

Testcontainers を䜿甚するこずで埗られるメリット:

  • 事前に統合テスト甚のむンフラを甚意する必芁がありたせん。Testcontainers API を䜿甚するず、テスト実行前に必芁なサヌビスを提䟛したす。むンフラの定矩コヌドは、実際のテストコヌドのすぐ隣に蚘述されるため、管理が簡単です。
  • 耇数のビルドパむプラむンが䞊行しお実行される堎合でも、各パむプラむンは隔離されたサヌビスセットで実行されるため、デヌタ競合やテストの干枉の問題がありたせん。
  • ナニットテストず同じように、統合テストをIDEから盎接実行できたす。倉曎をプッシュしおCIが統合テストを実行するのを埅぀必芁がありたせん。
  • テストの実行埌、Testcontainers がコンテナのクリヌンアップを自動的に凊理したす。

Testcontainers は、Java、.NET、Go、Node.js、Rust、Python など、倚くの人気のあるプログラミング蚀語で䜿甚できたす。たた、さらなる蚀語サポヌトが進行䞭です。

たずめ

統合テストにおける課題を確認し、モックやむンメモリサヌビスを䜿ったテストが必ずしも最適ではない理由を理解したした。その埌、Testcontainers が統合テストの課題をどのように解決し、実際のサヌビスを䜿甚したテストを可胜にするかに぀いお説明したした。

Testcontainers に぀いおさらに詳しく知りたい堎合は、https://testcontainers.com  をご芧ください。

参考資料

Last updated on