業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【ビジネス】
AI

執筆者:Hakky AI

Docker×テスト自動化|効率的な基盤構築とCodeceptJS連携

tip
記事のポイント
  • Dockerでテスト環境構築を効率化し、環境の一貫性と再現性を高め、テストの信頼性を向上。
  • CodeceptJSでE2Eテストを自動化し、UIテストを効率化、品質向上に貢献。Gherkin形式で記述も可能。
  • テスト自動化基盤をCI/CDに組み込み、テストを自動実行。エラー通知で迅速な対応を可能にする。

はじめに

近年、ソフトウェア開発の現場では、品質向上と開発速度の向上が求められています。その解決策として、DockerとCodeceptJSを活用したE2Eテスト自動化基盤の構築が注目されています。

本記事では、Dockerによるテスト環境の効率化と、CodeceptJSによるE2Eテストの自動化について解説します。CI環境への統合、テスト実行時間の短縮、エラー通知システムの構築、テスト結果の可視化など、具体的な導入と実践方法を解説します。

【完全無料】Hakky HandbookメルマガでAIのトレンドを見逃さない | 詳細はこちら

Docker環境におけるテスト自動化のメリット

Docker環境でテスト自動化を導入することで、テスト環境の構築、CI/CDパイプラインへの統合、テスト実行環境のポータビリティにおいて、効率化が可能です。

テスト環境の構築と維持の効率化

Dockerを利用することで、テスト環境の構築が大幅に簡素化されます。従来、手動で行っていた環境構築作業を、Dockerfileと呼ばれる設定ファイルに記述することで、誰でも同じ環境を迅速に構築できます。

この自動化により、環境構築にかかる時間と手間を大幅に削減し、開発者はより重要なタスクに集中できるようになります。また、Dockerコンテナは、OSやミドルウェア、アプリケーションとその依存関係をまとめてパッケージ化するため、環境の一貫性と再現性が向上します。

これにより、開発環境、テスト環境、本番環境の間で差異が生じるリスクを低減し、テストの信頼性を高めることが可能です。さらに、環境の変更やアップデートも容易に行えるため、テスト環境の維持にかかるコストも削減できます。

例えば、新しいライブラリの追加や設定変更が必要になった場合でも、Dockerfileを修正してコンテナを再構築するだけで、簡単に環境を更新できます。これにより、常に最新の状態を維持し、テストの品質を確保できます。

Dockerの導入は、テスト環境の構築と維持における効率化を実現し、開発チーム全体の生産性向上に貢献します。

CI/CDパイプラインへの統合

Dockerは、CI/CDパイプラインへの統合を容易にし、自動テスト実行を効率的に組み込むことができます。CI/CDパイプラインとは、開発からテスト、デプロイまでの一連のプロセスを自動化する仕組みです。

Dockerコンテナを使用することで、テスト環境をCI/CDパイプライン内で一貫して再現できるため、異なる環境間でのテスト結果のばらつきをなくし、信頼性の高いテストを実現できます。

例えば、JenkinsやGitLab CIなどのCIツールとDockerを組み合わせることで、コードの変更がpushされるたびに自動的にテストを実行し、その結果を開発者に通知することができます。

これにより、早期にバグを発見し、修正することが可能になり、開発プロセスの迅速化に貢献します。また、Dockerコンテナは軽量であるため、テストの実行に必要なリソースを効率的に利用できます。

これにより、テストの実行時間を短縮し、CI/CDパイプライン全体の処理能力を向上させることができます。さらに、Docker Hubなどのコンテナレジストリを利用することで、テスト環境のイメージを共有し、チーム全体で再利用することができます。

これにより、環境構築の手間を省き、開発効率を向上させることができます。

テスト実行環境のポータビリティ

Dockerコンテナは、異なる環境間でのテスト実行を容易にし、環境依存性の問題を排除します。従来のテスト環境では、OSやミドルウェアのバージョン、ライブラリの依存関係などが異なる環境でテストを実行すると、予期せぬエラーが発生することがありました。

しかし、Dockerコンテナを使用することで、テストに必要なすべての要素をコンテナに含めることができるため、環境の違いによる影響を受けずにテストを実行できます。

例えば、開発者のローカル環境、テストサーバー、本番環境など、異なる環境で同じDockerイメージを使用することで、一貫したテスト結果を得ることができます。

これにより、環境依存性の問題を解消し、テストの信頼性を向上させることができます。また、Dockerコンテナは、クラウド環境や仮想環境など、さまざまなプラットフォームで実行できるため、テスト環境のポータビリティを高めることができます。

これにより、柔軟なテスト環境の構築が可能になり、開発チームはより効率的にテストを実施することができます。さらに、Dockerコンテナは、環境のセットアップや構成を自動化するためのツールとしても利用できます。

これにより、手動での環境構築作業を削減し、テスト環境の準備にかかる時間とコストを削減することができます。

E2Eテスト自動化におけるCodeceptJSの役割

E2Eテスト自動化において、CodeceptJSは重要な役割を果たします。UIテストを効率化し、品質向上に貢献します。

CodeceptJSの導入と設定

CodeceptJSを導入する際は、まずNode.js環境が必要です。npx codeceptjs initコマンドで初期設定を開始し、必要な依存関係をインストールします。

次に、codecept.conf.jsファイルでテスト環境を設定します。このファイルでは、テスト対象のURL、使用するヘルパー(WebDriverやPuppeteerなど)、テストデータの場所などを指定します。例えば、WebDriverヘルパーを使用する場合、ブラウザの種類(Chrome、Firefoxなど)やWebDriverの設定を記述します。

テストシナリオは、testsディレクトリに作成します。各シナリオは、ユーザーの操作を模倣し、アプリケーションの動作を検証するコードで構成されます。Gherkin形式で記述することも可能です。これにより、技術者以外の関係者もテストケースを理解しやすくなります。

テスト実行前に、必要なブラウザドライバをインストールし、環境変数を設定します。これにより、CodeceptJSがブラウザを制御し、テストを実行できるようになります。

初期設定が完了したら、簡単なテストシナリオを作成し、実行してみましょう。これにより、設定が正しく行われているかを確認できます。例えば、Webサイトのタイトルを確認するテストや、フォームにデータを入力して送信するテストなどが考えられます。テストが成功すれば、CodeceptJSの導入と設定は完了です。

E2Eテストシナリオの作成

CodeceptJSを用いたE2Eテストシナリオの作成では、ユーザーの行動を模倣したテストケースを記述します。シナリオは、Feature、Scenario、Given、When、Thenといったキーワードを用いて構造化されます。

例えば、ログイン機能をテストする場合、まずFeature('ログイン機能')でテストの目的を定義します。次に、Scenario('正しいユーザー名とパスワードでログインできる')で具体的なテストケースを記述します。Given('ログインページにアクセスする')で前提条件を設定し、When('ユーザー名とパスワードを入力する')で操作を記述し、Then('ログインに成功する')で結果を検証します。

CodeceptJSでは、I.amOnPage()I.fillField()I.click()I.see()といったメソッドを使用して、Webページの要素を操作し、期待される結果を確認します。

テストシナリオは、testsディレクトリに保存し、ファイル名にはテストの内容がわかるように命名します。例えば、login_test.jsのようにします。

シナリオを構造化する際には、Page Objectパターンを利用すると、テストコードの再利用性が向上し、保守が容易になります。Page Objectパターンでは、Webページの要素と操作をクラスとして定義し、テストシナリオから呼び出して使用します。これにより、UIの変更があっても、Page Objectクラスを修正するだけで、複数のテストシナリオに影響を与えることなく対応できます。

テスト実行と結果の分析

CodeceptJSによるテスト実行は、codeceptjs runコマンドを使用します。このコマンドを実行すると、codecept.conf.jsファイルに設定されたテスト環境で、testsディレクトリ内のテストシナリオが実行されます。

テスト結果は、コンソールに表示されるほか、HTMLレポートやJSON形式で出力することも可能です。HTMLレポートは、テストの成功・失敗、実行時間、エラーメッセージなどを視覚的に確認できるため、テスト結果の分析に役立ちます。

テストが失敗した場合、エラーメッセージやスクリーンショットを確認し、原因を特定します。CodeceptJSでは、try-catchブロックを使用して、エラーをキャッチし、詳細な情報をログに出力することができます。

テスト結果の解析には、Allure Reportなどのツールを利用することも可能です。Allure Reportは、テスト結果を詳細なグラフや表で表示し、テストの傾向や問題点を把握するのに役立ちます。

テスト結果を分析し、改善点を見つけたら、テストシナリオやアプリケーションのコードを修正し、再度テストを実行します。このサイクルを繰り返すことで、テストの品質とカバレッジを向上させることができます。

また、テスト結果をチームで共有し、定期的にレビューすることで、テストの改善点を共有し、より効果的なテスト戦略を策定することができます。

DockerとCodeceptJS連携によるテスト自動化基盤構築

DockerとCodeceptJSを組み合わせることで、効率的かつ一貫性のあるE2Eテスト自動化基盤を構築できます。このセクションでは、具体的な構築手順とCI/CDパイプラインへの統合について解説します。

Dockerfileの作成と設定

Dockerfileは、CodeceptJSのテスト実行に必要な環境を定義するために不可欠です。まず、ベースとなるNode.jsのイメージを選択し、必要なパッケージをインストールします。例えば、Nightmareテストドライバーを使用する場合は、npm install -g codeceptjs codeceptjs-nightmareを実行します。

また、npm config set unsafe-perm trueを設定することで、権限に関する問題を回避できます。次に、テストコードと設定ファイルをDockerイメージにコピーします。最後に、CMD "codeceptjs", "run", "--env", "default", "--html", "report.html"を設定して、テスト実行時のコマンドを指定します。

これにより、Dockerコンテナが起動するたびに自動的にテストが実行されるようになります。Dockerfileの作成は、テスト環境の一貫性を保ち、異なる環境でのテスト結果の差異をなくす上で重要な役割を果たします。以下にDockerfileの例を示します。

FROM node:16

RUN npm install -g codeceptjs codeceptjs-nightmare \
    && npm config set unsafe-perm true

COPY . /app

CMD "codeceptjs", "run", "--env", "default", "--html", "report.html"

この例では、Node.js 16をベースイメージとして使用し、CodeceptJSとNightmareをグローバルにインストールしています。テストコードは/appディレクトリにコピーされ、コンテナ起動時にcodeceptjs runコマンドが実行されます。

Docker Composeによる環境構築

Docker Composeを使用すると、複数のコンテナを連携させてテスト環境を構築できます。例えば、データベースやSelenium/Firefoxなどのサービスを同時に起動し、CodeceptJSのテストからアクセスできるように設定します。

docker-compose.ymlファイルで、各コンテナのイメージ、環境変数、ポートなどを定義します。linksオプションを使用すると、コンテナ間の依存関係を簡単に設定できます。例えば、CodeceptJSのコンテナからデータベースコンテナにアクセスする場合、links: - dbと記述します。

また、volumesオプションを使用すると、ローカルのファイルをコンテナにマウントできます。これにより、テストコードの変更を即座にコンテナに反映させることができます。Docker Composeは、テスト環境のオーケストレーションを容易にし、複雑な環境でも一貫性のあるテスト実行を可能にします。以下にdocker-compose.ymlの例を示します。

version: '3'
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: username
      POSTGRES_PASSWORD: password
      POSTGRES_DB: database_name

  codeception:
    build: .
    volumes:
      - .:/app
    links:
      - db
    command: codecept run -d --env default --html report.html

  selenium:
    image: selenium/standalone-firefox
    ports:
      - "4444:4444"

この例では、PostgreSQL、CodeceptJS、Selenium/Firefoxの3つのコンテナを定義しています。CodeceptJSコンテナは、ローカルのファイルを/appディレクトリにマウントし、データベースコンテナにリンクしています。

CI/CDパイプラインへの組み込み

DockerとCodeceptJSで構築したテスト自動化基盤をCI/CDパイプラインに組み込むことで、開発プロセス全体を効率化できます。GitHub Actions、GitLab CI、Travis CIなどのCI/CDツールを使用し、コードの変更がpushされるたびに自動的にテストを実行するように設定します。

CI/CDパイプラインでは、まずDockerイメージをビルドし、Docker Composeでテスト環境を起動します。次に、CodeceptJSのテストを実行し、結果を収集します。テスト結果は、HTMLレポートやJUnit形式のXMLファイルとして保存し、CI/CDツールのダッシュボードで確認できるようにします。

また、テストが失敗した場合は、開発者に自動的に通知するように設定します。CI/CDパイプラインへの組み込みにより、開発者は常に最新のコードに対してテストを実行し、早期に問題を検出できます。以下にTravis CIの設定例を示します。

language: node_js
node_js:
  - "16"

before_script:
  - npm install -g codeceptjs

script:
  - codecept run -d --env default -c ./tests/be/acceptance

after_script:
  - ls _output/report.html

この例では、Node.js 16を使用し、CodeceptJSをグローバルにインストールしています。codecept runコマンドでテストを実行し、テスト結果のレポートを_output/report.htmlに保存しています。

テスト自動化の効率化とエラー通知

テスト自動化は、開発サイクルを加速し、ソフトウェアの品質を向上させる上で不可欠です。ここでは、テスト実行時間の短縮、エラー通知システムの構築、テスト結果の可視化に焦点を当て、効率的なテスト自動化戦略について解説します。

テスト実行時間の短縮

テスト実行時間の短縮は、開発サイクル全体の効率化に直結します。テストの並列実行やテスト分割といった手法を導入することで、大幅な時間短縮が可能です。

SeleniumとDockerの連携により、複数のコンテナを立ち上げてテストを並列実行し、全体のテスト時間を短縮できます。Diary-Converterプロジェクトでは、GitHub Actionsを用いたCI/CDパイプラインでテストを自動化し、テスト実行時間を短縮しました。

また、テスト実行におけるボトルネックを特定し、改善策を講じることも重要です。例えば、不要なテストステップの削除や、より効率的なテストコードへのリファクタリングなどが考えられます。

テスト対象を絞り込むことも有効です。E2Eテストの範囲を見直し、クリティカルな機能に焦点を当てることで、テスト実行時間を短縮できます。

テスト実行基盤の最適化も重要です。高速なストレージの使用や、十分なCPUリソースの確保など、インフラ側の改善も検討しましょう。

これらの対策を組み合わせることで、テスト実行時間を大幅に短縮し、開発効率を向上させることが可能です。

エラー通知システムの構築

エラー通知システムの構築は、問題発生時の迅速な対応を可能にし、手戻りを最小限に抑えるために不可欠です。テスト自動化ツールと連携し、テスト失敗時にSlackやメールへ自動で通知する仕組みを構築します。

  • Slack連携では、テストの失敗時にSlack botに通知が送信されるように設定します。
  • メール通知では、エラーが発生した際に、特定の人員にメールで通知する仕組みを作成します。
  • Kibanaのダッシュボードにエラーの発生状況を可視化し、エラー件数ごとにランキングを作成して、メールで担当者に通知する仕組みも有効です。

エラー件数が多い順にメールのタイトルに表示されることで、緊急度合いを一目で判断できます。

通知内容には、エラーが発生したテストケース、エラーメッセージ、関連するログ情報などを含めることで、迅速な原因特定を支援します。また、通知設定を柔軟に変更できるようにすることで、状況に応じた適切な通知を実現します。

これらの対策により、エラー発生時の対応を迅速化し、問題解決までの時間を短縮することが可能です。

テスト結果の可視化

テスト結果の可視化は、テストの品質を客観的に評価し、改善につなげるために重要です。テストレポートを自動生成し、テストの成功率、失敗率、実行時間などの情報を分かりやすく表示します。

  • Grafanaを用いてリグレッション検知数や自動テストの実行件数を可視化します。
  • KibanaやGrafanaを用いてエラー件数毎のランキングを作成し、緊急度の優先順位付けを可能にします。
  • TestRailのようなテスト管理ツールを使用し、特定のテストケースの実行時間やflaky-testのリストを可視化します。
  • 月別でのテスト実行詳細の記録も行い、エラーや問題点の抽出を容易にします。

これらの情報を分析することで、テストの弱点や改善点を発見し、品質向上に役立てることができます。

Valtes社の例では、リグレッションテストを実施し不具合の見逃しを少なくしました。SELECKの例では、Kibanaのダッシュボードを用いてエラーの発生状況を可視化し、エラー件数毎にランキングを設定して緊急度を優先順位付けしました。

これらの可視化ツールを導入することで、テスト結果を効果的に分析し、品質改善につなげることが可能です。

可視化ツール目的
Grafanaリグレッション検知数や自動テストの実行件数を可視化
Kibana, Grafanaエラー件数毎のランキングを作成し、緊急度の優先順位付け
TestRail特定のテストケースの実行時間やflaky-testのリストを可視化
記録月別でのテスト実行詳細を記録し、エラーや問題点の抽出を容易にする

テスト自動化基盤の運用と保守

テスト自動化基盤は、構築して終わりではありません。継続的なテスト環境の最適化を通じて、その効果を最大限に引き出す必要があります。

定期的なテストの見直し

テスト自動化基盤の品質を維持するためには、定期的なテストの見直しが不可欠です。テストケースは時間の経過とともに陳腐化し、新しい機能や変更に対応できなくなる可能性があります。

そのため、テストケースの更新と最適化を行い、常に最新の状態に保つ必要があります。テストケースを見直す際には、以下の点に注意してください。

  1. 網羅性の確認: テストケースがアプリケーションの主要な機能を網羅しているかを確認します。不足しているテストケースがあれば、新たに追加します。
  2. 冗長性の排除: 重複しているテストケースや、効果の低いテストケースを特定し、削除または修正します。これにより、テスト実行時間を短縮し、効率的なテストを実現できます。
  3. 優先順位の設定: テストケースに優先順位を設定し、重要な機能から順にテストを実行するようにします。これにより、限られた時間内で最も重要な問題を検出できます。
  4. 自動テストツール: Buckyなどの自動テストフレームワークを導入することで、テストケースの作成、管理、実行を効率化できます。これにより、テスト担当者の負担を軽減し、より高度なテストに集中できるようになります。
  5. テスト結果の分析: テスト結果を定期的に分析し、失敗したテストケースの原因を特定します。原因が特定できたら、テストケースを修正するか、アプリケーションのバグを修正します。テスト結果の分析には、専用のツールを使用すると便利です。

定期的なテストの見直しは、テスト自動化基盤の品質を維持し、ソフトウェアの信頼性を高めるために不可欠な作業です。継続的にテストケースを更新し、最適化することで、テスト自動化の効果を最大限に引き出すことができます。

環境アップデートへの対応

テスト自動化基盤を安定的に運用するためには、環境アップデートへの迅速な対応が求められます。Dockerイメージの更新や依存ライブラリのバージョン管理を適切に行うことで、テスト環境の整合性を保ち、予期せぬエラーを防ぐことができます。

環境アップデートに対応する際には、以下の点に注意してください。

  1. Dockerイメージの定期的な更新: ベースイメージやアプリケーションのイメージを最新の状態に保ちます。これにより、セキュリティ上の脆弱性を解消し、最新の機能を利用できるようになります。Docker Hubなどのレジストリから最新のイメージをpullし、必要に応じてDockerfileを修正します。
  2. 依存ライブラリのバージョン管理: アプリケーションが依存するライブラリのバージョンを適切に管理します。バージョンが古くなると、セキュリティ上の問題が発生したり、新しい機能が利用できなくなる可能性があります。npmやpipなどのパッケージマネージャを使用して、ライブラリのバージョンを固定し、アップデート時には互換性を確認します。
  3. テスト環境の分離: 本番環境とテスト環境を分離し、テスト環境でアップデートの影響を確認してから本番環境に適用します。これにより、本番環境での予期せぬエラーを回避できます。Docker Composeを使用すると、簡単に複数の環境を構築できます。
  4. 自動テストの実行: 環境アップデート後に、自動テストを実行し、アプリケーションが正常に動作することを確認します。テストが失敗した場合は、原因を特定し、修正します。CI環境に自動テストを組み込むことで、アップデートのたびに自動的にテストを実行できます。
  5. AWS環境: AWS上で実行されているinfrastructure config file内のchangesに対応するために、Docker compose servicesやrun-time environment variablesを設定することで、迅速なenvironment updateが可能です。

環境アップデートへの対応は、テスト自動化基盤の安定性を維持し、継続的なテストを可能にするために不可欠な作業です。計画的にアップデートを実施し、テスト環境を常に最新の状態に保つように心がけましょう。


info
〜ウェビナー告知【2025/06/19】〜

「データ・AI駆動で開発するプロダクト組織のあり方」をテーマに、理想のプロダクト組織のあり方、形成の勘所、そしてAI/データ駆動型組織への具体的な転換ステップをご紹介します。競争力のあるプロダクト開発を目指すなら、ぜひご参加ください!

  • ウェビナーテーマ:『データ・AI駆動で開発するプロダクト組織のあり方』
  • 開催日時:2025年6月19日(木) 10:00~20:00
  • 会場:オンライン開催(Zoom)

お問い合わせはこちらまで

おわりに

DockerとCodeceptJSを活用したテスト自動化は、開発効率を飛躍的に向上させます。しかし、環境構築や設定に課題を感じる方も少なくありません。

Hakkyでは、お客様の状況に合わせた機械学習プロダクト開発支援を提供しています。テスト自動化基盤の構築でお困りの際は、ぜひお気軽にご相談ください。詳細はこちらのバナーからご確認ください。

tip
お知らせ

自動テスト環境の構築でお困りではありませんか?Hakkyでは、開発効率を向上させる機械学習プロダクト開発を支援いたします。 DockerとCodeceptJS連携にご興味のある方は、まずはこちらのバナーから詳細をご覧ください。


関連記事

参考文献

2025年06月13日に最終更新
読み込み中...