わりと新しめ(2015年1月時点)の JavaScript フレームワークを使ったアプリのサンプルとその自動テストプログラムのサンプル。
- node.js (0.11.*)
- Bower
- Google Chrome
npm install
bower installgrunt serveでサーバを起動する。gruntで、すべてのテストを実行する。
app.js ... サーバアプリ本体
controllers/calc.js ... サーバアプリのビジネスロジック
public/index.html ... メインページ
public/example-calc.html ... カスタムタグ要素 <example-calc>
public/example-calc.js ... <example-calc> のロジック
-
ファイル変更時に自動再起動させるため、 nodemon を用いて実行する。
-
開発環境では nodemon の起動は grunt-nodemonを使用し、 Grunt 経由で行う (
grunt serveで起動)。
- app.js : アプリ本体。 ミドルウェア設定、ルーティング定義、クライアントからの接続待ち受け(listen)を行う。
- controllers/calc.js : ビジネスロジック(四則演算処理を行う)。
-
環境変数
PORTで指定されたポート番号でクライアントからの接続を待ち受ける。 -
koa-staticにより、public フォルダのファイルを表示する。
-
四則演算処理の入力値は以下のように HTTP GET メソッドのURLとして受け取り、 JSON 形式の文字列で結果を返す。
入力例:
GET /calc/add/1/2出力例:
{"result": 3}
- index.html : アプリのメインページ。
- example-calc.html :
<example-calc>要素のUI定義。 - example-calc.js :
<example-calc>要素の処理実装。 通常はこのような形でファイルを分けずにexample-calc.htmlの中に JavaScript を埋め込むのが一般的だが、カバレッジレポート取得を容易にするために、 ファイルを分割した。
- サーバとの通信は core-ajax 要素により行う。
auto属性を指定することにより、url属性値の変更時に自動的にサーバとの通信が行われる。
- サーバアプリ単体テスト、クライアントアプリ単体テスト、クライアント・サーバの通し(E2E)テストを実施する。
- テスト結果は JUnit XML 形式のファイルに出力する。
- 単体テストに関してはカバレッジレポートを出力する。
test/server/* ... サーバアプリのテスト
test/client/* ... クライアントアプリのテスト
test/e2e/* ... E2Eテスト
test-results/* ... テスト結果(JUnit XML形式)格納先フォルダ
coverage/* ... カバレッジレポート格納先フォルダ
できるだけテスト環境をシンプルにするため、ツールおよびフレームワークは以下の方針で選択する。
- 実行はすべて Grunt から行う。
- テストプログラム用のフレームワークとしては Mocha と Chai を利用する。
- カバレッジレポートは istanbul を使用し、 HTML 形式レポートおよび Cobertura 形式レポートを作成する。
- テストで使用するブラウザは Chrome とする。
grunt server-testで単体テスト実行、grunt mocha_istanbulでカバレッジレポート作成を行う。
- 単体テストを Grunt から実行するため、 grunt-mocha-testを使用する。
- カバレッジレポート作成を Grunt から実行するため、 grunt-mocha-istanbulを使用する。
- サーバ側では、ES6 Harmony の機能を利用するため、
これに対応した istanbul
が必要。このために、
npm install --save-dev gotwarlost/istanbul#harmonyで harmony ブランチの istanbul をインストールした。
- HTTPインターフェースに対するテストを簡単に行うために SuperTest を利用する。
- 開発中は
grunt karma:multiRunでファイル変更を監視させて、 コード修正に伴って自動的にテストさせることができるようにする。 CI環境などでは、grunt karma:singleRunでテスト実行する。
- Karma を利用してテスト実行する。
- テスト環境(テストフレームワーク、利用ブラウザ、レポーター、プリプロセッサ) の設定やテストプログラムが利用するライブラリは karma.conf.js に記述する。 このファイルに Mocha と Chai を指定する。
- カスタムタグ要素
<example-calc>を記述した HTML ファイル(example-calcTest.html)を利用するために karma-html2js-preprocessor を使用する。
- test/client/example-calcTest.js
- テスト前に実行される
beforeファンクションの中で example-calcTest.html の読み込みを行い、<example-calc>要素をcalc変数に設定し、 ロードされるまで待つ。 - サーバへのリクエストは実際に行わずに、 Sinon.JS のフェイクオブジェクトを使用する。
- テスト前に実行される
- 事前に
grunt serveでサーバアプリを起動しておき、grunt e2e-testで実行する。
- grunt-webdriver で実行することで、 Selenium WebDriver を利用し、 実際にブラウザを操作するイメージに近いテストを行う。
- ブラウザ操作は WebdriverIO で行う。
- test/e2e/indexTest.js
- WebDriver は、Shadow DOM をセレクタで指定できないため、
代替策として WebDriverIO の execute を用い、
ブラウザ側環境で
document.querySelectorを呼び出してセレクタ指定する。
- WebDriver は、Shadow DOM をセレクタで指定できないため、
代替策として WebDriverIO の execute を用い、
ブラウザ側環境で