MSTestでコンソールアプリをテストしようとしたら上手くいかない
受託開発担当の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をテストするときは注意したほうがいいみたいです。