拡張性と並列実行を備えたNUnit 3 - Charlie Poole氏に聞く

NUnit3が先頃リリースされ,並列実行と拡張性を備えた.NETテスティングフレームワークになった。InfoQでは,10年以上にわたってメンテナを務めるCharlie Poole氏に,今回のリリースについて詳しく聞いた。

InfoQ: 2年の開発期間の中でアルファ版5回,ベータ版5回,リリース候補2回を提供した後に,先月,最終バージョンがリリースされました。今回のメジャーバージョンのおもな目標は何でしたか?

Charlie Poole: そうですね,その質問に答える前に,実はそれよりもずっと長かったことを,アルファ版やベータ版のリリースをベースに説明させてください。最初にNUnit 3.0のアイデアを公表したのは,2007年にマドリードで開催されたMono Summitでした。Monoの開発者たちは熱心に話を聞いて,さまざまなアイデアを出してくれました。率直に言って彼らは,当時の一般的な.NETコミュニティの中では,“枠にとらわれない”考え方のできる人たちでしたね。

NUnitは開発から15年を数えます。今回のリリースの基本目標は,次の10年間に備えることです。NUnitは2002年の2.0で完全に書き直されましたが,今回は2度目の書き直しになります。メジャーバージョンとはそういうものです!

NUnitが今後も前に進み続けるためには,モジュラリティをもっと高める必要があると思っていました。単なるフレームワークではなく,本当の意味でのテスティングプラットフォームにしたいのです。同時に,単純なフレームワークとしての利用も,これまで通り可能にしたいと考えました。そのためにはユニットテストだけでなく,さまざまな種類のテストをサポートする必要があります。3.0には優れた機能がたくさんありますが,それらは氷山の一角に過ぎないと思っています。

3.0の製品版がリリースされたので,次のリリースをもっと早くリリースできるように作業を開始するつもりです — NUnit V2は10年以上経過してしまいましたから。実際に,バグ修正リリースのNUnit 3.0.1を間もなく出します。

InfoQ: 今回のリリースでもっともリクエストの多かった機能は何ですか?

CP: 大きなものとしては,属性でコントロール可能な並列テスト実行機能があります。別プロセスによる複数アセンブルの実行と,プロセス内のマルチスレッド実行という,2レベルの並列性がサポートされていて,それぞれが異なる状況で有用なものです。

もうひとつの大きな特徴は,テストを実行するプログラムを誰でも書けるように,公開APIを持ったテストエンジンを備えていることです。これまでそういったものがなかったため,NUnitをプログラム的に実行するコードを書くには,リリース間で変更される可能性のある内部クラスを使わざるを得ませんでした。サードパーティのテストランナ開発者には難しい状況だったのです。

第3の特徴は拡張性です。NUnit V2にも“NUnitアドイン”がありましたが,開発方法がとても複雑でした。3.0ではそれらを廃止して,2レベルの拡張性をサポートします。

  1. フレームワークのレベルで新しい属性を作成して,特定のインターフェースを実装することで,目的とする動作を提供する方法。ちなみにこのアプローチは,MbUnitからヒントを得ています — アイデアの共有は,オープンソースが技術革新に貢献するひとつの手段なのです。
  2. エンジン用プラグインの開発。これはNUnitをもっと“大きく”する方法です。例えば,エンジンドライバを拡張して,NUnit 3.0でV2のテストを実行できるようにすることも可能です。同じようなエクステンションはxUnit用やmsTest用にも,その気があればjunit用も作ることができます。この機能を利用すれば,将来的にはテストをリモート実行したり,あるいはデバイス上で実行したりすることも可能になるでしょう。

InfoQ: 新しいプラットフォームとしては,どのようなものがサポートされているのでしょう?

CP: 現在のフレームワークライブラリはポータブルに構築されているので,NET 4.5以降,NET Core(Windowsユニバーサルアプリ10以降,DNX Core 5以降),Windows 8,Windows Phone 8(Silverlightを使用),ユニバーサル(WIndows Phone 8.1以降,Windows 8.1以降),Xamarin(MonoTouch,MonoAndroid,Xamarin iOSユニバーサル)上でテストを実行することができます。

.NET 2.0やSliverlight, .NET CF 3.5などの旧プラットフォームも,もちろんサポートしています。.NET 1.1と.NET CF 2.0については,サポートを終了しました。

InfoQ: 今回の成果で,もっとも満足しているのは何ですか?

CP: NUnitがまだ生きていることです!2005年頃から,NUnitはもう終わりだという意見が,人々の口の端に上るようになりました。最大の理由は,Microsoftの“公式”テストフレームワークが登場したことです。オープンソースのテストプロジェクトはすべて,息の根を止められるだろうと言われていました。そうはならなかっただけでなく,終わりだと噂さわれたことが,かえって多くのイノベーションを生み出す原動力になりました。その結果NUnit Test Development Platformが,すなわちNUnit 3.0が誕生したのです。

第2の大きな成果は,コミッタやコントリビュータ,コミュニティメンバによる素晴らしいサポート体制が生まれて,それを維持できたことです。このようなコミュニティを作り上げるのは,技術者として誰でも経験できることではないので,それを成し遂げたことはもちろん誇りに思っています。73になって,2020年までもNUnitの開発を続けようとは思いませんので,誰か後を続けてくれる人がいるとうれしいですね!実際,GitHubでプロジェクトの共同オーナになったRob Prouse氏は,何回かのリリース管理で素晴らしい仕事をしてくれました。

InfoQ: 何か付け加えたいことはありますか?

CP: 2002年の私は,仕事で使うために,オープンソースのテストプロジェクトを探していたのですが,当時同じチームのメンバが開発に関わっているという理由で,おもにNUuitを使っていました。しばらくして私もそのプロジェクトに参加したのですが,結局,最後までそこに残ることになったのです。幸運にも他の人たちが新たに加わってくれていますので,私がチームを離れても開発が終わることはないでしょう。

NUnitのソースコードはGitHubで公開されている。同じリポジトリには,アップグレードガイドを始めとするNUnit 3のドキュメントも含まれている。