window.pipedriveLeadboosterConfig={です。 ベース:'leadbooster-chat.pipedrive.com'、 companyId:11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2、 } ;(function () { var w = window もし (w.LeadBooster) {なら console.warn('LeadBooster already exists') } else { w.LeadBooster = { {. q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: 関数 (n) { { this.q.push({ t: 'o', n: n, h: h }) this.q.push({ t: 't', n: n }) }, } } })() テストコンテナ - テストをより簡単にするには?- The Codest
The Codest
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 産業
    • フィンテック&バンキング
    • E-commerce
    • アドテック
    • ヘルステック
    • 製造業
    • 物流
    • 自動車
    • アイオーティー
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
戻る矢印 戻る
2022-07-26
ソフトウェア開発

テスト・コンテナ - テストをより簡単にするには?

バルトロミエ・クジンスキー

より簡単にテストを行う方法をお探しですか?お任せください!以下の記事をチェックして、それを可能にする方法を学んでください。

現代のアプリケーション開発は、あるシンプルなルールに基づいている:

コンポジションを使用する

私たちは、クラス、関数、サービスを組み合わせて、より大きなソフトウェアの一部とする。この最後の要素がマイクロサービスの基礎であり 六角形建築.私たちは、既存のソリューションを使用し、私たちのソフトウェアとそれらを統合し、直接、次の段階に進みたいと考えています。 マーケット.

アカウント登録を処理し、ユーザーデータを保存したいですか?OAuthサービスの1つを選ぶことができます。あなたのアプリケーションは、何らかの購読や支払いを提供していますか?これを処理するのに役立つサービスがたくさんあります。あなたのウェブサイトに分析が必要ですが、GDPRを理解していませんか?お気軽に、すぐに使えるソリューションをご利用ください。

ビジネスの観点からはとても簡単に開発できるものが、簡単なテストを書く瞬間には頭痛の種になるかもしれない。

ファンタスティック・ビーストキュー、データベースとそのテスト方法

ユニットテストはとてもシンプルだ。ルールさえ守れば、テスト環境と コード は健康である。それはどんなルールですか?

  • 書きやすい - ユニットテストは簡単に書けるはずだ。労力が少ないということは、より多くのテストが書かれるということだ。
  • 可読 - テストコードは読みやすくなければならない。テストは物語である。ソフトウェアの動作を記述するものであり、ドキュメントのショートカットとして使うこともできる。優れたユニットテストは、コードをデバッグせずにバグを修正するのに役立ちます。
  • 信頼できる - テストが失敗するのは、テスト対象のシステムにバグがある場合だけである。明らかですか?そうとは限らない。テストを1つずつ実行するとパスするが、セットで実行すると失敗することがある。あなたのマシンではパスするが、CIでは失敗する (私のマシンで動作).優れたユニットテストには、失敗の原因が1つしかない。
  • 速い - テストは高速でなければならない。実行の準備、開始、テストの実行そのものが非常に迅速でなければならない。そうでないと、テストは書いたが実行はしない、ということになりかねない。テストが遅いということは、集中力が欠けているということです。進捗バーを見ながら待つ。
  • 独立系 - 最後に、テストは独立したものでなければならない。このルールは前のルールから派生している。本当に独立したテストだけがユニットになれる。互いに干渉せず、どのような順番で実行してもよく、潜在的な失敗は他のテストの結果に依存しない。また、独立しているということは、データベースやメッセージングサービス、ファイルシステムなどの外部リソースに依存していないということでもある。外部リソースと通信する必要がある場合は、モックやスタブ、ダミーを使うことができます。

統合テストを書こうとすると、すべてが複雑になる。いくつかのサービスをまとめてテストするのは悪くない。しかし、データベースやメッセージング・サービスのような外部リソースを使用するサービスをテストする必要がある場合、それはトラブルの元となる。

テストを実行するには、以下のものをインストールする必要がある。

何年も前のことだが、データベースなどを使って統合テストを行おうとしたとき、2つの選択肢があった:

  1. ローカルにデータベースをインストールできる。スキーマを設定し、テストから接続します;
  2. 宇宙のどこか」にある既存のインスタンスに接続することができる。

どちらも長所があり、短所もある。しかし、どちらもさらなる複雑さをもたらす。例えば、ローカルホスト上でのオラクルDBのインストールや管理などである。時には、テストに同意する必要があるなど、プロセス上の不都合もあった。 チーム JMSの使用について...テストを実行するたびに。

コンテナの救出

この10年間で、コンテナ化という考え方が業界で認知されるようになった。だから、統合テストの問題の解決策としてコンテナを選ぶのは自然な判断だ。これはシンプルでクリーンなソリューションだ。プロセスのビルドを実行するだけで、すべてがうまくいく!信じられませんか?mavenビルドのシンプルな構成を見てみよう:

<ビルド
 <プラグイン
   <プラグイン
     com.dkanejs.maven.pluginsの場合
     docker-compose-maven-pluginがあります。
     4.0.0</バージョン
     <エクセキューション
       <エクセキューション
         アップ</id
         テストコンパイル</フェーズ
         <ゴール
           アップ</ゴール
         </ゴール
         <構成
           ${プロジェクト.basedir}/docker-compose.ymlを参照してください。
           true。
         
       </execution
       <実行
         ダウン</id
         post-integration-test</フェーズ
         <ゴール
           ダウン</ゴール
         </ゴール
         <コンフィギュレーション
           ${project.basedir}/docker-compose.yml。
           true。
         
       </execution
     
   
 
</ビルド

そして docker-compose.yml ファイルもなかなか良さそうだ!

バージョン"3.5"

サービス

 postgres:
   コンテナ名: reactivedb
   image: postgres:13.2
   再起動: 常に
   環境
     - POSTGRES_USER=admin
     - POSTGRES_PASSWORD=パスワード
     - POSTGRES_DB=cities
   ポート
     - "5432:5432"
   ボリューム
     - POSTGRES_DATA:/データ/DB

 pgadmin:
   コンテナ名: pgadmin4
   イメージ: dpage/pgadmin4
   再起動: 常に
   環境変数
     pgadmin_default_email: [email protected]
     PGADMIN_DEFAULT_PASSWORD: パスワード
   ポート
     - "15050:80"
   ボリューム:
     - pgadmin_data:/data/pgadmin

ボリューム:
 ボリューム: pgadmin_data:/data/pgadmin
 pgadmin_data:

しかし、ここに問題があることにお気づきだろうか?

すべてを遮る貨物船

上の例はとてもシンプルです。1つのpostgresデータベースとpgAdminだけです。次のように実行します。

バッシュ
$ mvn clean verify

そして、mavenプラグインがコンテナを起動し、テストが終わったらコンテナをオフにする。プロジェクトが大きくなり、composeファイルも大きくなると問題が発生する。その都度、すべてのコンテナを起動する必要があり、ビルド全体を通してコンテナが生き続けることになる。プラグインの実行設定を変更することで、少しは状況を改善できますが、それだけでは不十分です。最悪のシナリオでは、テストが始まる前にコンテナがシステムリソースを使い果たしてしまう!

問題はこれだけではない。IDEから統合テストをひとつも実行できないのだ。その前に、手作業でコンテナを起動する必要がある。さらに、次のmavenの実行で、それらのコンテナは破棄される(次のセクションを参照)。 ダウン 実行)。

つまり、このソリューションは大きな貨物船のようなものだ。すべてがうまく機能すればそれでいい。予期せぬ、あるいは一般的でない行動は、何らかの災難につながる。

テストコンテナ - テストからコンテナを実行する

しかし、テストからコンテナを実行できるとしたらどうだろう?このアイデアは良さそうだし、すでに実装されている。 テストコンテナこのプロジェクトについて話しているのだから、ここに我々の問題に対する解決策がある。理想的ではないが、完璧な人間などいない。

これは ジャワ ライブラリはJUnitとSpockテストをサポートし、軽量で簡単なDockerコンテナの実行方法を提供する。これを見て、コードを書いてみよう!

前提条件と設定

始める前に、設定をチェックする必要がある。 テスト容器 が必要だ:

  • Dockerのバージョンv17.09、
  • Javaの最低バージョンは1.8、
  • ネットワーク、特にdocker.hubへのアクセス。

特定のOSとCIの要件の詳細については、以下を参照してください。
で ドキュメンテーション.

さて、次は次の行を追加する番だ。 pom.xml.

プロジェクトでは、定型文を減らすためにスプリングブートを使っている。 テスト容器 はSpring Frameworkから独立しているので、Spring Frameworkなしで使うことができる。
<プロジェクト
 <依存関係管理
   <依存関係
     <依存関係
       org.testcontainersの場合
       testcontainers-bom。
       ${testcontaines.version}となります。
       pom
       インポート</スコープ
     
    </dependencies
  </dependencies
 <依存関係
   <依存関係
     org.postgresql。
     postgresql。
     ランタイム。
   
   <依存関係
     org.testcontainersの場合
     postgresql。
     テスト。
   
   <依存関係
     org.testcontainersの場合
     junit-jupiterです。
     テスト。
   
 
</プロジェクト

私はこうしている。 テスト容器 バージョン 1.17.3ただし、最新のものをご自由にお使いください。

Postgresコンテナによるテスト

最初のステップは、コンテナのインスタンスを用意することだ。これはテストの中で直接行うこともできるが、独立したクラスの方が見栄えがよい。

public class Postgres13TC extends PostgreSQLContainer {.

 private static final Postgres13TC TC = new Postgres13TC();

 プライベートPostgres13TC()
   super("postgres:13.2");
 }

 public static Postgres13TC getInstance() { { { { { Postgres13TCを取得します。
   TC を返します;
 }

 オーバーライド
 public void start() {
   super.start();
   System.setProperty("DB_URL", TC.getJdbcUrl());
   System.setProperty("DB_USERNAME", TC.getUsername());;
   System.setProperty("DB_PASSWORD", TC.getPassword());
 }

 オーバーライド
 public void stop() { // 何もしない。
   // 何もしない。これは共有インスタンスだ。この操作はJVMに任せましょう。
 }
}

テストの最初に ポストグレス13TC.このクラスはコンテナに関する情報を扱うことができる。ここで最も重要なのは、データベース接続文字列と認証情報である。それでは、とても簡単なテストを書いてみましょう。

テストコンテナ
クラス SimpleDbTest

 コンテナ
 private static Postgres13TC = Postgres13TC.getInstance();

 テスト
 void testConnection() {
   assumeThat(postgres13TC.isRunning());
   var connectionProps = new Properties();
   connectionProps.put("user", postgres13TC.getUsername());
   connectionProps.put("password", postgres13TC.getPassword());

   try (Connection = DriverManager.getConnection(postgres13TC.getJdbcUrl()、
       connectionProps))
     var resultSet = connection.prepareStatement("Select 1").executeQuery();
     resultSet.next();
     assertThat(resultSet.getInt(1)).isEqualTo(1);
   } catch (SQLException sqlException) { {.
     assertThat((Exception) sqlException).doesNotThrowAnyException();
   }
 }
}

ここではJUnit 5を使っている。アノテーション テストコンテナ は、テスト環境のコンテナを制御するエクステンションの一部である。を持つすべてのフィールドを見つけます。 コンテナ アノテーションと、それぞれスタートとストップのコンテナ。

Spring Bootを使ったテスト

前にも述べたように、プロジェクトではSpring Bootを使っている。この場合、もう少しコードを書く必要がある。最初のステップは、追加の設定クラスを作成することです。

Slf4j
public class ContainerInit implements
   ApplicationContextInitializerを実装しています。

 public static Postgres13TC;

 スタティック
   postgres13TC = Postgres13TC.getInstance();
   postgres13TC.start();
 }

 オーバーライド
 public void initialize(ConfigurableApplicationContext applicationContext) { } @override
   TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
       applicationContext、
       "spring.datasource.url=" + postgres13TC.getJdbcUrl()、
       "spring.datasource.username=" + postgres13TC.getUsername()、
       "spring.datasource.password=" + postgres13TC.getPassword()、
       "db.host=" + postgres13TC.getHost()、
       "db.port=" + postgres13TC.getMappedPort(postgres13TC.POSTGRESQL_PORT)、
       "db.name=" + postgres13TC.getDatabaseName()、
       "db.username=" + postgres13TC.getUsername()、
       "db.password=" + postgres13TC.getPassword()
   );
 }
}

このクラスは、既存のプロパティを テスト容器.最初の3つのプロパティは、標準的な Spring のプロパティです。次の5つは追加のカスタムプロパティで、liquibase のような他のリソースや拡張機能を設定するために使用できます:

spring.liquibase.change-log=classpath:/db/changelog/dbchangelog.xml
spring.liquibase.url=jdbc:postgresql://${db.host:localhost}:${db.port:5432}/${db.name:cities}。
spring.liquibase.user=${db.username:admin}。
spring.liquibase.password=${db.password:password} です。
spring.liquibase.enabled=true

さて、次は簡単な統合テストを定義する番だ。

SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureTestDatabase(replace = NONE)
@ContextConfiguration(initializers = ContainerInit.class)
テストコンテナ
クラス DummyRepositoryTest

 自動化
 private DummyRepository;

 テスト
 void shouldReturnDummy() { 以下のようにします。
   var byId = dummyRepository.getById(10L);
   var expected = new Dummy();
   expected.setId(10L);
   assertThat(byId).completes().emitsCount(1).emits(expected);
 }
}

ここで少し注釈を加えておく。

  • SpringBootTest(webEnvironment = RANDOM_PORT) - はテストをSpring Bootテストとしてマークし、springコンテキストを開始します。
  • AutoConfigureTestDatabase(replace = NONE) - これらのアノテーションは、spring test 拡張モジュールが postgres データベースの設定をメモリ設定の H2 に置き換えてはいけないことを示しています。
  • ContextConfiguration(イニシャライザ = ContainerInit.class) - 追加の春コンテキスト
    からプロパティを設定する。 テスト容器.
  • テストコンテナ - 前述のように、このアノテーションはコンテナのライフサイクルを制御する。

この例ではリアクティブ・リポジトリーを使用していますが、一般的なJDBCやJPAのリポジトリーでも同じように動作します。

これでこのテストを実行できる。最初の実行の場合、エンジンはdocker.hubからイメージをプルする必要がある。これには少し時間がかかる。その後、2つのコンテナが実行されたことがわかるだろう。1つはpostgresで、もう1つはTestcontainersコントローラだ。この2つ目のコンテナは実行中のコンテナを管理し、JVMが予期せず停止した場合でも、コンテナの電源を切って環境をクリーンアップする。

要約しよう。

テスト容器 は非常に使いやすいツールで、Dockerコンテナを使用した統合テストを作成するのに役立ちます。これにより、柔軟性が増し、開発スピードが向上します。テスト構成を適切にセットアップすることで、新人開発者の受け入れに必要な時間が短縮される。彼らはすべての依存関係をセットアップする必要はなく、ただ選択した設定ファイルを用いて書かれたテストを実行するだけです。

協力バナー

関連記事

ソフトウェア開発

将来を見据えたウェブ・アプリケーションの構築:The Codestのエキスパート・チームによる洞察

The Codestが、最先端技術を駆使してスケーラブルでインタラクティブなウェブアプリケーションを作成し、あらゆるプラットフォームでシームレスなユーザー体験を提供することにどのように秀でているかをご覧ください。The Codestの専門知識がどのようにデジタルトランスフォーメーションとビジネス...

ザ・コデスト
ソフトウェア開発

ラトビアを拠点とするソフトウェア開発企業トップ10社

ラトビアのトップソフトウェア開発企業とその革新的なソリューションについて、最新記事でご紹介します。ラトビアの技術リーダーたちがあなたのビジネスをどのように向上させるかをご覧ください。

thecodest
エンタープライズ&スケールアップ・ソリューション

Javaソフトウェア開発の要点:アウトソーシングを成功させるためのガイド

outsourcingのJavaソフトウェア開発を成功させるために不可欠なこのガイドを読んで、The Codestで効率性を高め、専門知識にアクセスし、プロジェクトを成功に導きましょう。

thecodest
ソフトウェア開発

ポーランドにおけるアウトソーシングの究極ガイド

ポーランドのoutsourcingの急増は、経済、教育、技術の進歩がITの成長とビジネス・フレンドリーな環境を促進していることによる。

ザ・コデスト
エンタープライズ&スケールアップ・ソリューション

IT監査ツール&テクニック完全ガイド

IT監査は、安全かつ効率的で、コンプライアンスに準拠したシステムを保証します。その重要性については、記事全文をお読みください。

The Codest
ヤクブ・ヤクボヴィッチ CTO & 共同創設者

ナレッジベースを購読して、IT部門の専門知識を常に最新の状態に保ちましょう。

    会社概要

    The Codest - ポーランドに技術拠点を持つ国際的なソフトウェア開発会社。

    イギリス - 本社

    • オフィス 303B, 182-184 High Street North E6 2JA
      イギリス、ロンドン

    ポーランド - ローカル・テック・ハブ

    • ファブリチュナ・オフィスパーク、アレハ
      ポコジュ18、31-564クラクフ
    • ブレイン・エンバシー, コンストルクトースカ
      11, 02-673 Warsaw, Poland

      The Codest

    • ホーム
    • 会社概要
    • サービス
    • Case Studies
    • ノウハウ
    • 採用情報
    • 辞書

      サービス

    • アドバイザリー
    • ソフトウェア開発
    • バックエンド開発
    • フロントエンド開発
    • Staff Augmentation
    • バックエンド開発者
    • クラウドエンジニア
    • データエンジニア
    • その他
    • QAエンジニア

      リソース

    • 外部ソフトウェア開発パートナーとの協力に関する事実と神話
    • 米国から欧州へ:アメリカの新興企業がヨーロッパへの移転を決断する理由
    • テックオフショア開発ハブの比較:テックオフショア ヨーロッパ(ポーランド)、ASEAN(フィリピン)、ユーラシア(トルコ)
    • CTOとCIOの課題は?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • ウェブサイト利用規約

    著作権 © 2025 by The Codest。無断複写・転載を禁じます。

    jaJapanese
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek jaJapanese