受託開発担当のRyuです。

.NetのテストではNUnitかMSTestを使っている人が多いのではないかと思います。
個人的にはVisual Studio単体で動かせるMSTestが好きなので、重たいテストでなければMSTestを使うことが多いのですが、今回はそのMSTestでコンソールアプリをテストしようとしたときにつまづいた話です。

コンソールアプリをテストするにあたって以下のようなコードを書きました。


[TestMethod]
public void Test1()
{
	Process p = new Process();
	p.StartInfo.FileName = "Target.exe";
	p.StartInfo.UseShellExecute = false;
	p.StartInfo.RedirectStandardOutput = true;
	p.StartInfo.RedirectStandardInput = false;
	p.StartInfo.CreateNoWindow = true;

	p.Start();

	string results = p.StandardOutput.ReadToEnd();

	p.WaitForExit();
	p.Close();
	
	Assert.AreEqual(results, "正常に終了しました。");
}

上記コードで、Target.exeを実行するプロセスを生成して、実行後のコンソール出力を検証します。
しかしこのコードを実行してみるとp.Start()で失敗します。
MSTestでは実行時に自動的にTestResultsフォルダを生成して、そこにテスト用のファイル一式をコピーしてテストが行われます。
早速失敗した原因を調べにTestResultsを見てみると、どうもTarget.exeがコピーされていないようです。
ちゃんと参照設定に追加されているのになぜ?と思いつつ、試行錯誤した結果以下のコードを、テストに追加すれば動作することがわかりました。


[TestInitialize]
public void Initialize()
{
    // Target.exe内のクラス
    Target instance = new Target();
}

参照設定に追加したexeやdllでも、一度はコード中で参照しておかないとTestResultsフォルダにコピーされない模様。
別プロジェクトでビルドしたexeをテストするときは注意したほうがいいみたいです。