レポートおはようございます。ベンジャミンの木村と申します!今回、AWSのCICD機能の一つであるCodeBuildで、LaravelのUnitテストを実行し、その結果を下記のようにグラフで見える化を行いましたので、その方法を紹介させていただきます。今回は下記赤枠のCodeBuildでのLaravelのUnitテストを実行しています。※Laravelの初期状態をインストールしています。taskdef.jsonCodeシリーズの紹介CodeCommitソースコードを管理するAWSのマネージサービスになります。GithubのAWSバージョンだと考えていただければOKです!CodeBuildソースコードのビルドを行うAWSのマネージドサービスになります。「ビルドとはなんぞや?」という方は、コードを実際に動かせるように色々変化するツールだと覚えていただければOKです。imageに変換します。今回はこのサービスの中でコードのテストを実行します。CodeDeployAWSのマネージドのデプロイサービスになります。ECSを作成する上ではタスク定義(taskdef.json)というコンテナの設計書をデプロイし、その設計書に沿ってコンテナが立ち上がっていきます。CodePipelineCI/CD(継続的デリバリー/継続的インテグレーション)をサポートするサービスになります。「CI/CDがわからない!」という方は、CodeCommitへソースコードがあがれば、CodeBuildが動いてビルドが完了したら、CodeDeployが動いての一連の動作を繋いであげるためのものと覚えていただければOKです!Unitテストとは?Unitテストとは単体テストとも言われます。ソフトウェア開発において個々の「Unit」(通常はプログラムの中で最小の機能単位)をテストするためのプロセスです。Unitテストの主な目的は、各Unitが設計どおりに動作することを確認することです。※Unitとは関数・メソッド、クラスやモジュールなどのプログラムの塊のようなものです。CodeBuildでUnitテストを実施してみようそれでは、CodeBuildでUnitテストを実施していきましょう!まずは、CodeBuildのビルド実施内容を記載したbuildspec.ymlを用意しましょう。imageにしてECRに登録するためのコードを記載しています。赤文字部分でUnitテスト実施するコードを記載しています。Unitテスト実施コードの詳細な内容説明については、この後記載させていただきます。今回実施するテストコードは、Laravelの初期インストール時に初期から設定されているExampleTest.phpとTestCase.phpを用いて実施します。taskdef.jsonそれでは追記した内容について、説明させていただきます。1一時的なコンテナの立ち上げコンテナの中でテストを実施するため、一時的なDockerコンテナ(test_container)を起動します。それが下記コマンドになります。src_php:latest各部分の詳細は以下の通りです。run:Dockerコンテナを起動するコマンドです。-d:このオプションは、コンテナをバックグラウンドで実行するためのものです。test_container:起動するコンテナにtest_containerという名前を付けています。$(pwd)/app:/prj:ホストマシンの$(pwd)/appディレクトリをコンテナ内の/prjディレクトリにマウントしています。これにより、ホストマシンとコンテナ間でファイルを共有できます。※$(pwd)は現在の作業ディレクトリを表します。src_php:latest:起動するDockerイメージの名前を指定しています。buildを実行」のところで作成したイメージを使用しています。このコマンドを実行すると、src_php:latestイメージを使用して仮のDockerコンテナ(test_container)がバックグラウンドで起動します。ホストマシンの現在の作業ディレクトリのappサブディレクトリがコンテナ内の/prjディレクトリにマウントされます。2PHPUnitのインストールテストコマンドを実施するために、既に実行中のDockerコンテナ(test_container)内で、Composerを使ってPHPUnitを開発用(dev)としてインストールします。phpunit/phpunit各部分の詳細は以下の通りです。test_container:実行中のDockerコンテナ(test_container)内に入るためのコマンドです。phpunit/phpunit:Composerを使ってPHPUnitを開発用としてインストールするコマンドです。--devオプションは、開発環境専用の依存関係としてパッケージをインストールすることを指定します。実行中のDockerコンテナ(test_container)内で、LaravelのArtisanコマンドラインツールを使ってテストを実行し、その結果をJUnit形式のXMLファイルに出力します。phpunit-log.xm各部分の詳細は以下の通りです。test_container:実行中のDockerコンテナ(test_container)内に入るためのコマンドです。phpunit-log.xml:LaravelのArtisanコマンドラインツールを使ってテストを実行し、その結果をphpunit-log.xmlという名前のJUnit形式のXMLファイルに出力するコマンドです。※phpunit-log.xmlというファイルはこの後のグラフ化で使用します。4コンテナ内のXMLファイルをローカル(CodeBuildの/tmpディレクトリ)に出力コンテナ内で作成したXML(phpunit-log.xml)ファイルが、コンテナ内に入ったままだと、この後のグラフ化で利用できないため、ローカル(CodeBuildの/tmpディレクトリ)にコピーします。/tmp/phpunit-log.xml[finalllyブロックについて]commandブロックでエラーが発生(テストが失敗)しても、finallyブロック内のコマンドは必ず実行されます。testのテストが失敗した際でも、後続のcopyコマンドが実行されるようにfinallyにこのcopyコマンドを置いています。※コピーファイルがない場合はレポートが「不完全」として表示されます。CodeBuildでUnitテストの結果をグラフ化しよう項番1で実行したテスト内容を記載したXMLファイルを利用して、CodeBuildのレポート機能でテスト結果をグラフで出力したいと思います。レポート機能の記載については下記コードのAfterで赤色の部分になります。taskdef.json各部分の詳細は以下の通りです。reports:テストレポートの設定を定義するセクションです。SurefireReports:テストレポートの名前です。※この名前は任意で記載できますが、ビルドプロジェクト内で一意である必要があります。files:テストレポート(phpunit-log.xml)のファイルを指定します。base-directory:テストレポートファイルが格納されているディレクトリ(/tmp)を指定します。file-format:テストレポートファイルの形式(XML)を指定します。これで準備が整いましたので、コードをCodeCommitにpushしてCICDパイプラインを動かしましょう!※CodeBuildはテストが失敗すると、ビルドも失敗し、CICDパイプラインが止まります。その場合でもテストレポートは出力されます。上記の通りCodeパイプラインの操作が完了したら、左ペインの「CodeBuild」→「レポート履歴」→出力された「レポート」をクリックしましょう!以下のようにテスト結果が表示されれば、完了となります!※ちなみにレポート出力がうまくいっていないとステータスが「不完全」となります。初期状態のLaravelをCodeBuildでテストすると一つ失敗します。name="Feature">のブロックをコメントアウトしましょう。</testsuite>そうすることで、失敗したテストが実行されなくなり、下記のようにCodeBuildでのビルドも成功します。まとめいかがでしたでしょうか?Codebuildのレポート機能を使うと、Unitテストの結果が一目でわかるようになります。今回はLaravelでUnitテストを実行しましたが、テストコマンドをDjangoやRails用にすることで他のバックエンドでも同じように、テストを実行できます。他のバックエンドでもコンテナを立ち上げる際にも参考にしていただければ、幸いです。Benjamin.Inc。