翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS CodeBuild を使用して GitHub から Node.js アプリケーションのユニットテストを実行する
作成者: Thomas Scott (AWS)、Jean-Baptiste Guillois (AWS)
概要
このパターンは、Node.js ゲーム API のサンプルソースコードと主要ユニットテストコンポーネントを提供します。また、継続的インテグレーションおよび継続的デリバリー (CI/CD) ワークフローの一環として、AWS CodeBuild を使用した、GitHub リポジトリーからのこれらのユニットテストの実行方法も含まれます。
ユニットテストは、ユニットと呼ばれるアプリケーションのさまざまな部分が個別に独立してテストされ、正しく動作するかどうかがテストされるソフトウェア開発プロセスです。テストはコードの品質を検証し、期待どおりに機能することを確認します。テストを参考にすれば、他の開発者も簡単にコードベースに慣れることができます。ユニットテストは、将来のリファクタリング時間を短縮し、エンジニアがコードベースに素早く慣れるようにする上で役立ち、期待される動作に自信を与えます。
ユニットテストでは、AWS Lambda 関数など、個々の関数をテストします。ユニットテストを作成するには、テストフレームワークとテスト (アサーション) を検証する方法が必要です。このパターンのコード例では、Mocha
ユニットテストとテストコンポーネントの例の詳細については、「追加情報」セクションを参照してください。
前提条件と制限
アーキテクチャ
このパターンは、次の図に示すアーキテクチャを実装します。

ツール
ツール
Git
は、コード開発に使用できるバージョン管理システムです。 AWS CodeBuild は、ソースコードをコンパイルし、テストを実行し、すぐにデプロイできるソフトウェアパッケージを生成するフルマネージドの継続的統合サービスです。CodeBuild を使用すると、ビルドサーバーのプロビジョニング、管理、スケーリングが不要になります。CodeBuild では、継続的にスケーリングされ、複数のビルドが同時にプロセスされるため、ビルドの実行までキューで待機することはありません。パッケージ済みのビルド環境を使用、またはご自分のビルドツールを使用するカスタムビルド環境を作成できることですぐに開始できます。CodeBuild では毎分ごとに使用するコンピューティングリソースの使用量が有料になります。
コード
このパターンのソースコードは、GitHub のサンプルゲームユニットテストアプリケーション
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
サンプルプロジェクトに基づいて独自の GitHub リポジトリを作成します。 |
| アプリ開発者、AWS 管理者、AWS DevOps |
新しい CodeBuild プロジェクトを作成します。 |
| アプリ開発者、AWS 管理者、AWS DevOps |
ビルドを開始します。 | 確認 ページで、[Start build(ビルドの開始)] を選択してビルドを実行します。 | アプリ開発者、AWS 管理者、AWS DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
新しい CodeBuild ビルドプロジェクトを作成します。 |
| アプリ開発者、AWS 管理者、AWS DevOps |
ビルドを開始します。 | 確認 ページで、[Start build(ビルドの開始)] を選択してビルドを実行します。 | アプリ開発者、AWS 管理者、AWS DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
テスト結果を表示します。 | CodeBuild コンソールで、CodeBuild ジョブのユニットテスト結果を確認します。結果は追加情報セクションに表示されている結果と一致するはずです。 これらの結果は、GitHub リポジトリと CodeBuild の統合を検証します。 | アプリ開発者、AWS 管理者、AWS DevOps |
Webbook を適用します。 | これで Webhook を適用できるようになったため、コードの変更をリポジトリのメインブランチにプッシュするたびに自動的にビルドを開始できます。手順については、CodeBuild ドキュメントを参照してください。 | アプリ開発者、AWS 管理者、AWS DevOps |
関連リソース
サンプルゲームユニットテストアプリケーション
(サンプルコードを含む GitHub リポジトリ) GitHub Webbook イベント(CodeBuild ドキュメント)
新しいリポジトリの作成
(GitHub ドキュメント)
追加情報
ユニットテスト結果
プロジェクトが正常にビルドされると、CodeBuild コンソールに次のテスト結果が表示されるはずです。

ユニットテストコンポーネントの例
このセクションでは、ユニットテストで使用される 4 種類のテストコンポーネント (アサーション、スパイ、スタブ、モック) について説明します。各コンポーネントの簡単な説明とコード例が含まれています。
アサーション
アサーションは期待される結果の検証に使用されます。これは特定の関数からの期待される応答を検証するため、重要なテストコンポーネントです。次のサンプルアサーションは、新しいゲームを初期化するときに、返される ID が 0 から 1000 の間であることを検証します。
const { expect } = require('chai');
const { Game } = require('../src/index');
describe('Game Function Group', () => {
it('Check that the Game ID is between 0 and 1000', function() {
const game = new Game();
expect(game.id).is.above(0).but.below(1000)
});
});
スパイ
スパイは関数を実行中に何が起きているかの観察に使用されます。たとえば、関数が正しく呼び出されたことを確認する必要があります。次の例は、Game クラスオブジェクトで開始メソッドと停止メソッドが呼び出されることを示しています。
const { expect } = require('chai');
const { spy } = require('sinon');
const { Game } = require('../src/index');
describe('Game Function Group', () => {
it('should verify that the correct function is called', () => {
const spyStart = spy(Game.prototype, "start");
const spyStop = spy(Game.prototype, "stop");
const game = new Game();
game.start();
game.stop();
expect(spyStart.called).to.be.true
expect(spyStop.called).to.be.true
});
});
スタブ
スタブは関数のデフォルトレスポンスのオーバーライドに使用されます。これは関数が外部リクエストをする場合に特に便利です。ユニットテストから外部リクエストをしないようにするためです。(外部リクエストは、異なるコンポーネント間のリクエストを物理的にテストできる統合テストにより適しています)。次の例では、スタブが getId 関数からのリターン ID を強制します。
const { expect } = require('chai');
const {.stub } = require('sinon');
const { Game } = require('../src/index');
describe('Game Function Group', () => {
it('Check that the Game ID is between 0 and 1000', function() {
let generateIdStub = stub(Game.prototype, 'getId').returns(999999);
const game = new Game();
expect(game.getId).is.equal(999999);
generateIdStub.restore();
});
});
モック
モックは、さまざまなシナリオをテストする動作があらかじめプログラムされたフェイクメソッドです。モックはスタブの拡張版と見なすことができ、複数のタスクを同時に実行できます。以下の例では、モックを使用して 3 つのシナリオを検証します。
関数の呼び出し
引数による関数の呼び出し
関数は整数 9 を返す
const { expect } = require('chai');
const {.mock } = require('sinon');
const { Game } = require('../src/index');
describe('Game Function Group', () => {
it('Check that the Game ID is between 0 and 1000', function() {
let mock = mock(Game.prototype).expects('getId').withArgs().returns(9);
const game = new Game();
const id = get.getId();
mock.verify();
expect(id).is.equal(9);
});
});