一般的な目標
CI の目的で、(コマンドライン経由で) ヘッドレス ソリューション全体ですべてのテストを実行する PowerShell スクリプトを作成しようとしています。個別に実行できる UnitTests と IntegrationTests があります。
ソリューション構造
このソリューションは、Visual Studio 2013 ソリューションです (Professional バージョンを使用)。すべてのプロジェクトには、必要に応じて、テスト用に 1 つまたは 2 つの個別のプロジェクトがあります。1 つのプロジェクトは単体テスト用で、もう 1 つのプロジェクトは統合テスト用です。簡単な命名規則に従います。
- コンポーネント: Namespace.ComponentName
- 単体テスト: Namespace.ComponentName.Test
- Int。test : Namespace.ComponentName.IntegrationTest
テスト ツール
VSTest.Console.exe を使用してテストを実行しています。
現在失敗しているソリューション
または単体テストのみ、または統合テストのみを実行しようとしています。そのため、すべてのテスト dll ファイルをスキャンし、それらをサフィックスでフィルター処理するというアイデアがありました。
単体テストの例:
# Declare my parameter that will contain the targeted TestFileNames
$Parameters = '';
# Get all the test project names, space separated that match *.Test.dll in my solution
Get-ChildItem $RepositoryRootLocation -Filter *.Test.dll -Recurse | ? {$_.fullname -notmatch 'obj'} | % { $Parameters = $Parameters + $_.FullName+ " "};
#Run the VSTest.Console.Exe with the specified test project names
& $MsTestConsolePath $Parameters ;
これは正常に動作するはずです。唯一の問題は、ネストされたサブフォルダーに 40 以上のテスト プロジェクトがあることです。これにより、このスクリプトを実行すると例外が発生します:
Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
メッセージは自明なので、問題は、いくつかの厄介な単純な制限にぶつかっているため、この問題は拡張可能ではないということです。
主な質問
フィルターに基づいてテスト プロジェクトの特定のサブセットのみを実行できる VSTest.Console.exe を使用する別の方法はありますか?
問題に取り組むために別の角度から取り組まなければなりませんか? または、すべてのテスト プロジェクトがソリューション リポジトリのサブフォルダーにある場合、完全なファイル パスではなく、テスト プロジェクト名のみを使用できますか?
重要: 簡単に拡張できるはずなので、新しく作成されたすべてのテスト プロジェクトでこれを testsettings ファイルなどに追加する必要はありません。ソリューション内のすべてのテスト プロジェクトを実行し、ユニット タイプまたは統合タイプであるかどうかをフィルタリングできるようにしたいと考えています。
テスト プロジェクト名のフル パス名を短縮するためにディスクのルートにリポジトリを配置することは、スクリプトが任意のマシンで実行される可能性があるため、柔軟ではありません。