Nightwatchは、Node.js上で動く受け入れテスト用のフレームワークである。このツールは、Webアプリケーションのテストを自動化するために、Selenium WebDriver APIを使用している。また、Selenium Serverと相性が悪いJavaScriptやCSSセレクタを使ってEnd-to-Endテストを書くことができるよう、シンプルなシンタックスを用意している。
独立して動作し、モックやスタブを使用するBDDやユニットテストとは反対に、End-to-Endテストはできるかぎり本物のシステムのユーザに近い感覚をエミュレーションしようとする。Webアプリケーションの場合、それはブラウザの起動、ページの読み込み、JavaScriptの実行、DOM操作などを意味している。Nightwatchはシンタックスシュガーを用いて、この目標を達成しようとしているのだ。
this.demoTestGoogle = function (browser) {
browser
.url(“http://www.google.com”)
.waitForElementVisible('body', 1000)
.setValue('input[type=text]', 'nightwatch')
.waitForElementVisible('button[name=btnG]', 1000)
.click('button[name=btnG]')
.pause(1000)
.assert.containsText('#main', 'The Night Watch')
.end();
};
自動テストを書くプロセスをシンプルにする他に、Nightwatchは開発においてシステムの完全な検証を行うため、継続的インテグレーションパイプラインと統合することもできる。
現在の機能一覧は、NightwatchのWebサイトで確認することができる。
- シンプルながらも強力なシンタックスは、JavaScriptとCSSのセレクタのみで、テストを素早く記述できるようにする。その他のオブジェクトやクラスを初期化する必要はなく、テストのスペックを記述するだけで良いのである
- 同梱されているコマンドライン版のテストランナーは、グループ化したテストを一度に実行することも、単独で実行することもできる
- Selenium Serverの自動管理(Seleniumが他のマシン上で実行している時は無効にできる)
- 継続的インテグレーションのサポート(JUnitのXMLフォーマットのレポーティングが組み込まれており、HudsonやTeamcityといったビルドシステムのビルドプロセスと統合することができる)
- CSSセレクタもしくはXpathを用いて、ページ内のエレメントの走査や検証もしくはコマンドの実行を行う
- アプリケーションに特有のコマンドを実装する必要がある場合、簡単に拡張できる
最近のJavaScript界隈では、PhantomJSとともに受け入れテストを行う上で、Seleniumが最も人気なツールの1つとなっており、それぞれが独自のアプローチをとっている。それは、SeleniumがWebDriver APIと、PhantomJSのCUIのみのWebKitブラウザを使用するというものである。どちらもコミュニティからの強力なサポートがある、非常に成熟したツールである。これらのツールとNightwatchとの大きな違いは、主にシンタックスのシンプルさと継続的インテグレーションのサポートにある。SeleniumとPhantomJSは、コーディング量を増やすことにつながるより冗長なシンタックスを持ち、そしてNightwatchが行っているようなコマンドラインで簡単に設定できる継続的インテグレーションのサポート(JUnitのXMLフォーマットもしくはその他の標準的なアウトプット)を行っていない。
それでもなお、Nightwatchはより成熟したツールとなるべく、進化し続けている。Node.jsベースの受け入れテスト用フレームワークであるWD.js開発者のSebastien Vincent氏は、コールバックを管理するために選択した実装に関するいくつかの批判をGoogleグループで行った。
非同期呼び出しが関係している場合、キュー(待ち行列)によるメソッドチェーンは悪いデザインパターンです。何かややこしいことをしようとしたらすぐに、またはちょっとしたものを作るにしても、結局は手動でキューを停止させ、タスクを追加することになります(しかし、おそらくNightwatchはこの私の認識が間違っていることを証明してくれるでしょう)
Vincent氏は、NightwatchとSelenium Server間の下位レイヤーの通信プロトコルの貧弱さについても指摘した。
Nightwatchは、HTTPプロトコルについて見ただけでも、リトライやタイムアウトに対応していないことや、GETとDELETEメソッドに対してContent-LengthやContent-Typeを設定できないなどの問題があり、成熟には程遠いです。このことはsauce-connectやキューイングといった込み入ったケースにおいて、かなり早い段階で破綻を招くでしょう。
こうした批判にも関わらず、このツールはGitHubの今月(2月)もっとも活発なリポジトリとして注目されており、またTwitterアカウントはコミュニティおよび開発者とのやりとりから、フィードバックを受け付けている。