BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース JavaScriptでBDDを実現するCucumber.js - Julien Biezemans氏へのインタビュー

JavaScriptでBDDを実現するCucumber.js - Julien Biezemans氏へのインタビュー

ブックマーク

原文(投稿日:2014/04/15)へのリンク

Julien Biezemans氏はCucumberコアチームのメンバであり,Cucumber.jsの作者である。Cucumber.jsはCucumberをJavaScriptネイティブで実装したもので,任意のJavaScript環境で動作する完全な移植版だ。

Node.jsが動作する任意のブラウザ上だけでなく,Cucumber.jsは事実上,JavaScriptとHTMLを生成するすべてのもの(Node.js, Ruby on Rails, PHP, .NETなど)に対して使用することができる。

InfoQ: Cucumber.jsとは何でしょう? 注目すべき理由と,それがどのような問題を解決するのかを教えてください。

Biezemans: Cucumber.jsは,BDD(Behavior-driver development)ツールとして有名なCucumberをJavaScriptに移植したものです。Cucumberは最初,Aslak Hellesøy氏がRubyで実装したのですが,現在ではJVMや.NET,PHP,C++などでも実装されています。

Cucumberは英語やフランス語など人間の言語で記述された仕様(おもにソフトウェア開発に関わるもの)をJavaScriptやRuby,あるいはJavaのようなコンピュータに理解可能なコードに変換するオートメーションツールです。生成されたコードからは,任意のタイプのソフトウェアを自動実行することができます。Webアプリケーションの自動化としてはすでに一般的なソリューションですが,最近ではネイティブなモバイルアプリ開発や組み込みシステム,さらにはハードウェアのテストなど,さまざまなフィールドで利用されています。

BDDはアジャイル方法論のひとつです。テスト駆動開発をベースとして,Dan North氏によって開発されました。BDDでは,プロジェクトに関わるすべての人々のコミュニケーション(Communication),会話(Conversation),緊密な協力関係(Close Collaboration)を推奨します。中でも基本的な目標のひとつが,ビジネスとテクノロジの間にある,周知のギャップを埋めることです。この2つの世界から来た人たちは,お互いを理解しないことが非常に多いのです。

自然言語でシナリオ(あるいは”例”)を書くというアイデアは,コミュニケーション問題を解決するアプローチのひとつです。これらの仕様は利害関係者間の議論の中で,共有する語彙を使って作成され,リファレンスとして使用されるだけでなく,システム開発を実際に進める上でも利用されます - 開発者はそこに述べられたシステム機能を実装する前に,それらの仕様を自動化するでしょう。コーディングプロセスを仕様に沿って進めるためのテストになるのです。そして最終的にはライブドキュメントとして,あるいは退行テストの項目として,長期にわたって使用されることになります。

InfoQ: Cucumber.jsのユースケースをいくつか挙げて頂けますか?

Biezemans: Cucumberの仲間がほとんどそうであるように,Cucumber.jsの典型的なユースケースはwebの自動化です。Cucumber.jsはNode.jsスタック上に記述されていますが,任意のJavaScript環境 (ブラウザでも!)で動作可能です。広範な環境で使用できるというのは,他の実装に比べて,Cucumber.jsのユニークな部分です。今日のJavaScriptは,ユビキタス言語だと言ってもよいでしょう。すべてのブラウザで利用できるのはもちろんの事,Node.jsやJVMのような技術のおかげで,サーバ上でも動作するのです。ざっと名前を挙げるだけでもNode.jsやAungular.js, Backbone, PHP, Java, Ruby, Railsなど,さまざまな技術を使ってWebアプリ構築を自動化しているチームがあります。

それ以外にも,Cucumber.jsには興味深い利用方法があります。Node.jsでネットワークリソースに(HTTPなどで)アクセスする処理が格別に効率的で快適なのです。Cucumber.jsとネットワーク指向のアサーションライブラリ(バックエンドはJavaScriptベースでなくても構いません)の組み合わせによるHTTP APIのテストが非常に簡単で,広く実施されている理由がここにあります。特に注目してほしいのはこの点です。すなわち,CucumberはWebやHTTP,ネットワーク,CLIといったものについては何も知りません。自然言語で記述された仕様を,実行可能なコンピュータコードに変換するためにあるのです。コードに何をフックしようとも,Cucumberは一切関知しません。

Cucumber.jsはコマンドラインアプリケーションの自動化にも使用できます (Cucumber.jsにはCLIで実行可能な自身のテストスイートがありますから,これが好例になるでしょう)。

InfoQ: どちらかが他方のツールよりも適しているのは,どのような種類の問題なのか,説明して頂けますか? Cucumber.jsを使うべき状況,それ以外のツールを使った方がよい状況とは,どのようなものなのでしょう?

Biezemans: JavaScriptのTDD/BDDなどのテストツールたくさんあります。その中にはよいものもあります。Cucumber (Ruby) は数年前まで,ハイプの波を被っていました。皆が銀の弾丸だと思って飛びついたのです。しかしながら,(プレーンな自然言語で記述された仕様のような)Cucumberの求める余分なレイヤを追加することには,多くの場合あまり意味がありませんでした。

当時は開発者と他の利害関係者との対話もなかったため,英語で記述されたシナリオは必要とされていませんでした。不適切な理由でメンテナンスコストを押し上げて,コーダの邪魔をするだけの存在だったのです。

今日でもその状況は変わっていません。私たち技術系の人間には新しいピカピカのツールに引き付けられる傾向があること,そのツールで何度も失敗を重ねるまで本当の価値を考えようとしないこと,この2つは周知の事実です。Cucumberの導入を考えている人に対して,次のような自問をお勧めしたいと思っています - “チーム(技術系だけではなく,全員)にとって,プレーンな英語でシナリオを書くことにメリットはあるのか?誰かの理解を容易にしたり,コミュニケーションをより効率的にするために役立つチャンスはあるのか?"答がイエスならば,その仕事にとってCucumberは適切なツールかも知れません。

ただし,誤解しないでほしいのですが,Cucumberを”技術的側面”のみで使用して成功を収めているチームもあります。彼らが成功した理由は,シナリオを用いることで技術的な問題を離れて,彼らの構築するシステムの能力や振る舞いといった部分に対する期待について,より深く検討することが可能になったからだ,と私は考えています。

InfoQ: Cucumber.jsのコミュニティについて教えてください。コミュニティボランティアからの貢献はありましたか,InfoQ読者によるコントリビュートは可能でしょうか?

Biezemans: Cucumber.jsが生まれてほぼ3年ですが,コミュニティは成長を続けています。比較的小規模で,Node.jsコミュニティと同じようなことが起きています。非常にさまざまなところから人々が集まっているのです。JavaScriptが広く普及していることもあって,さまざまなコミュニティから開発者やテスタが参加しています。私たちのものと同じような問題が,まったく違う方法で解決されていることもしばしばです。新たなエクスペリエンスやアイデアを共有する機会が得られるという意味で,本当に価値のあるものになっていると思います。多様性のすばらしさですね!

その逆も真,つまり私たちが効率的な原則ないしプラクティスと考えるもの(例えばBDD!)を,これまで繋がりを持たなかったコミュニティへと広める上で,JavaScriptが好都合なベクトルになっています。

常連の貢献者もいますし,皆とても協力的です。私たちは,Cucumberの”サブコミュニティ”を立ち上げるプロセスに,一緒に参加しているのです。まさに今年のCukeUp!カンファレンスのテーマ "One Big Happy BDD Family”を地で行く感がありますね。また,特定のテクノロジにコミュニティが分裂することは,何としても避けたいと思っています。Cucumberのメールリストがひとつしかないのはそのためです。Jetbrains Webstorm 8やVisual StudioといったポピュラーなIDEにも,Cucumber.jsがサポートされるようになりました。ツールの採用という面で,よい兆候だと思います。

コントリビュートの意思があればどなたでも,Cucumber.jsのGitHubリポジトリで保留中の問題をチェックして,プルリクエストを送ってください。

InfoQ: 次のメジャーリリース(0.4.5になるのでしょうか?)に向けて,どのようなことに取り組んでいるのか,教えてください。リリースはいつになりそうですか?

Biezemans: まずはプラグインシステムですね。処理結果のフォーマッタのようなリスナをアタッチすることは今でも可能ですが,2つ問題があります。

  1. 内部オブジェクトを取り扱う必要がある。

  2. CLI引数のパーサがフレキシブルでなく,Cucumber.jsをターミナルから起動した場合,プラグイン関連のオプションを指定することができない。

Cucumber.jsをもっとモジュール化して,NPMやBowerのように,シンプルなプラグインをレポジトリに公開できるようにすることが目標です。 プラグインAPIのためにリリース0.5を公開することになると思います。多分,Cucumber Ltd.で開発中のコラボレーションプラットフォームであるCucumber Proのサポート追加に依存したものになるでしょう。

興味深いところでは,並行動作に関するプルリクエストがあります。近いうちにマージされると思います。

webに使用しているパッケージシステムも見直したいと思っています。先程説明したように,Cucumber.jsはNode.jsを使用しているので,ブラウザで実行するにはNode.jsをバンドルしなければなりません。このあたりのコードがかなり分かりにくいのです。Browserifyの古いバージョンをベースとしていて,テストされていないのです。

それから,どんなプロジェクトもそうですが,問題がいくつかあります。特にJavaScriptのコールバックやフックに関するものは,修正しなければなりません。

InfoQ: 長期計画としては,どのような計画がありますか?

Biezemans: webパッケージシステムの改良が終わったら,ブラウザのみの状態でもっと使えるものにしたいと思っています。ブラウザでの動作は今でも可能ですが,簡単ではありません。ブラウザ環境には独立した”市場”があると思います。特にAngular.jsやEmber.jsといったフレームワークが台頭していることを考えると,これは残念な状況です。

先程述べたように,ドキュメントにも改善の余地があります。Cucumber.jsをさまざまな環境で使うための例やチュートリアル,デモンストレーションをもっと充実させれば,特に初心者には有用と思っています。

他のCucumber実装に比較して,副次的な機能で不足しているものがいくつかあります(詳細はREADMEの開発ステータス表に記載)。これらもリリース1.0までに実装しなければなりません。

InfoQ: Cucumber.jsの開発あるいはBDD一般に関すること以外で,現在興味を持っていることを教えてください。

Biezemans: サービス指向アーキテクチャ,イベントソーシング,ドメイン駆動設計などに関心を持っています。これらの概念やパターンをベースとしたシステムを,これまで何年も開発してきました。以前にPlutoniumという,DDD/イベントソーシング用の実験的なNode.jsライブラリをオープンソース公開したことがあるのですが,将来的にはこれをもう少し発展させてみたいですね。

私は設計者を目指しています(そして知識も!)。

コンピュータ以外では,家族と時間を過ごすのが好きです。子供は喜びと発見の源といった感じですね。科学全般に興味があるのですが,特に物理学と宇宙論には関心を持っています。あとは,音楽なしには生きていけないのですが,自分自身ではギターは長く弾いていません。

この記事に星をつける

おすすめ度
スタイル

BT