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をテストするときは注意したほうがいいみたいです。