検索
リンク
タグ
SQL Server
ASP.NET MVC
Azure
Plone
JavaScript
ADO.NET Entity Framework
Visual Studio
WebMatrix
jQuery
C#
LINQ
ASP.NET Core
Selenium
AJAX
ライトニングトーク
.NET
Fizz-Buzz
ASP.NET
AngularJS
F#
カテゴリ
最新の記事
最新のコメント
記事ランキング
最新のトラックバック
以前の記事
2019年 11月 2019年 10月 2019年 09月 2019年 08月 2019年 07月 2019年 06月 2019年 05月 2019年 04月 2019年 03月 2019年 02月 2019年 01月 2018年 12月 2018年 11月 2018年 10月 2018年 09月 2018年 08月 2018年 07月 2018年 06月 2018年 05月 2018年 04月 2018年 03月 2018年 02月 2018年 01月 2017年 12月 2017年 11月 2017年 10月 2017年 09月 2017年 08月 2017年 07月 2017年 06月 2017年 05月 2017年 04月 2017年 02月 2017年 01月 2016年 12月 2016年 11月 2016年 10月 2016年 09月 2016年 08月 2016年 07月 2016年 06月 2016年 05月 2016年 04月 2016年 03月 2016年 02月 2016年 01月 2015年 12月 2015年 11月 2015年 10月 2015年 09月 2015年 08月 2015年 07月 2015年 05月 2015年 04月 2015年 03月 2015年 02月 2015年 01月 2014年 12月 2014年 11月 2014年 10月 2014年 09月 2014年 08月 2014年 06月 2014年 04月 2014年 03月 2014年 02月 2014年 01月 2013年 12月 2013年 10月 2013年 09月 2013年 08月 2013年 07月 2013年 06月 2013年 05月 2013年 04月 2013年 03月 2013年 02月 2013年 01月 2012年 12月 2012年 11月 2012年 10月 2012年 09月 2012年 08月 2012年 07月 2012年 06月 2012年 05月 2012年 04月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 04月 2011年 03月 2011年 02月 2011年 01月 2010年 12月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 10月 2009年 09月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 ファン
ブログジャンル
画像一覧
|
2008年 03月 01日
前回の投稿で書いた、NUnit と MSTest とでのテストコードの共有が、じつは難しいのではないかとの件の続き。
例えば、指定したフォルダ以下のファイルとサブフォルダの一覧を Dictionary で返すようなクラスライブラリの単体テストコードを作成するものとする。 このようなケースでは、このテスト対象のクラスライブラリに走査させるテスト用のファイルとサブフォルダが必要であろう。 このような、テストを行うために必要な外部ファイルを、「周辺ファイル」と呼ぶことにする(「周辺ファイル」という用語は MSTest 関連のドキュメントから)。 で、NUnit と MSTest とでは、この、周辺ファイルの取り扱い方が異なってくるのだ。 NUnit ポイントは、テストに必要な周辺ファイルを、テストプロジェクトの出力フォルダ(bin\Debug)に配置することである。 NUnit のテストランナーでの実行の際、このテストプロジェクト出力フォルダがアプリケーションドメインのベースディレクトリになるので、テストコード上からは、AppDomain.CurrentDomain.BaseDirectory でアクセスできる。 周辺ファイルの配置方法だが、まず、周辺ファイル原本はテストプロジェクトフォルダ直下に配置し、プロジェクトに含めておく。 ソリューションエクスプローラ上からこれら周辺ファイルのプロパティを開いて、「出力ディレクトリにコピー」=「常にコピー」と設定しておけば、ビルドのたびに、周辺ファイル原本が出力フォルダにコピーされるようになる。 ただし、この方法では、空のフォルダを出力フォルダ以下へコピーすることができない。 「フォルダ内のファイルの本数を数えて返す」プログラムのテストを行いたい場合などに、「ファイルがひとつもないフォルダ」もテスト対象としたいので、これでは困る。 そんなときは、 プロジェクトのプロパティ→ビルドイベント→ビルド後に実行するコマンドライン で、xcopy などのシェルコマンドを列記することで解決できる(xcopyなら /E スイッチを付けておくことで、空のフォルダもコピーできる)。 「ビルド後に実行するコマンドライン」では、$(ProjectDir) や $(TargetDir) などのマクロが使えるので、これらマクロを使用することで、テストプロジェクトフォルダ直下の周辺ファイル原本を出力フォルダへコピーすることができるようになる。 MSTest さて、MSTest では、Visual Studio 2008 上からの実行時、アプリケーションドメインのベースディレクトリは Visual Studio IDE のフォルダになる(もうこの時点で、NUnit の場合とは事情が異なる)。 また、MSTest ではテストを実行する環境が、ソリューションのあるフォルダ\TestResults\実行構成スキームフォルダ("テストフォルダ"と呼ぶらしい) にテスト実行のたびに作成され、累々と結果が蓄積される。 (蓄積される本数は、Visual Studio 2008 のオプション設定[ツール(T)]-[オプション(O)...] から、[テストツール]-[テストの実行] 内の[古いテスト結果の最大数(L)]で指定できる) このテストフォルダを、テストコード上から参照するにはどうするかというと、MSTest 用のテストクラスをテンプレートから作成した際にはじめから記述されている、TextContext オブジェクトに問い合わせる。 どうやら、MSTest では、テストクラスをインスタンス化する際に、そのテストクラスオブジェクトの TestContext プロパティに、TestContext オブジェクトを挿入してくるようだ。 よって、各テストメソッド中では、this.TestContext.TestDir プロパティを参照することで、テストフォルダのパスを取得できる。 NUnit では AppDomain.CurrentDomain.BaseDirectory を利用していたが、MSTest では TestContext オブジェクトを利用することになる。 この時点で、NUnit と MSTest とでのテストコードの共有は困難に思える。 で、テストに必要な周辺ファイルの配置だが、こういう事情なので、NUnit の場合のように、出力フォルダに配置しても意味がない。 MSTest では、Solution Items として追加されるテスト実行構成(*.testrunconfig)を編集することで、周辺ファイルの配置を行う。 ソリューションエクスプローラからテスト実行構成(*.testrunconfig)を開くと、テスト実行構成編集用のダイアログが開く。 このダイアログに「配置」のカテゴリがあるので、ここに周辺ファイルを登録しておくとよい。 こうして登録されたファイルは、テスト実行のたびに、テストフォルダ直下の Out フォルダ以下にコピーされる。 なお、この Out フォルダのことを "テスト配置フォルダ" と呼ぶ模様。テスト配置フォルダへのパスは、テストコード中からは、TestContext オブジェクトの TestDeploymentDir プロパティで取得できる。 ところが、やっぱり、テスト実行構成の「配置」での周辺ファイルコピーでは、空のフォルダはコピーされない。 このような場合は、テスト実行構成編集ダイアログの「セットアップおよび後処理用のスクリプト」カテゴリを使う。 周辺ファイルをテスト配置フォルダにコピーするバッチファイルを作成し、テスト実行構成編集ダイアログ-「セットアップおよび後処理用のスクリプト」カテゴリ-「セットアップスクリプト」の欄に、このバッチファイルへのパスを指定する。 こうすると、テスト実行のたびに、このバッチファイルが実行される。 このバッチファイル中で、周辺ファイルのテスト配置フォルダへのコピーを行うコマンドを書けばよい。 ちょっとここで落とし穴。 テスト実行構成編集ダイアログの「...」ボタンを押してファイルダイアログを使ってこのバッチファイルを選択すると、このバッチファイルへのフルパス(絶対パス)で格納されてしまうのだ。 絶対パスが必ずしも悪いとは言えないが、開発チーム各位で開発用のドライブ・フォルダ構成が一致していなかったり、ソリューションの物理配置を変更したくなった場合にはこれでは都合悪い。 幸い、実際には、ソリューションフォルダからの相対パスで指定できるので、".\TestProject\SetUp.cmd" などと手作業で指定しておくとよい。 さて、このバッチファイル実行時には、以下の環境変数が使えるようになる。 TestDeploymentDir - テスト配置フォルダのフルパス TestDir - テストフォルダのフルパス TestLogsDir - (本投稿では触れていないが)テストログフォルダのフルパス ここでもうひとつ落とし穴。 周辺ファイル原本へのファイルパスを取得するための環境変数はないのだ。 また、バッチファイル実行時のカレントフォルダはテスト配置フォルダとなっているので、カレントフォルダを基点として下位フォルダをたどることでは、テストプロジェクトフォルダに辿り着けない。 仕方がないので、環境変数 TestDir が指しているフォルダから2階層上のフォルダ(%TestDir%\..\..)を手繰ることでソリューションのフォルダであるはず、としてテストプロジェクトのフォルダを決定しコピーを行うバッチとした。 ということで、まとめ 周辺ファイルをテスト環境に配置するための手法が、NUnit と MSTest とで異なるのは、まぁ、まだ仕方がない。 というか、とりあえず MSTest 用に環境つくっておいて、後日、NUnit でも動かしたいとなったら、そのときに、NUnit 用にビルドイベントのバッチファイルを書けばよい。 しかしながら、テストコード中、周辺ファイルがあるフォルダパスの入手方法が、NUnit では AppDomain.CurrentDomain.BaseDirectory を参照、MSTest ではテストクラスの TestContext プロパティ参照というのはちょっとやっかいだ。 この件も、条件コンパイルなどでうまいこと回避できるものだろうか? MSTest での周辺ファイルの配置などで苦労したので、今回はここまで...
by developer-adjust
| 2008-03-01 12:38
| テスト
|
Comments(0)
|
ファン申請 |
||