web-dev-qa-db-ja.com

MSTestテストの実行中にConsole.Outに書き込む方法

コンテキスト:
Webアプリケーションのファイルアップロード機能に関する問題を報告するユーザーがいます。たまにしか発生せず、特別なパターンもありません。私たちは長い間それを理解しようとして、それが役立つと思われるところにデバッグ情報を追加したり、ログをクロールしたりしましたが、それを再現したり、理解することができませんでした。

問題:
MSTestとWatiNを使用して、何度も(数百回)失敗するはずの操作を繰り返すことで、これを再現しようとしています。ループのどこでテストが行​​われたかについての手掛かりを得るために、次のようなものを出力したいと思います。

Console.WriteLine(String.Format("Uploaded file, attempt {0} of {1}", i, maxUploads));

ただし、これは[出力]ウィンドウには表示されません。これで、テスト結果にコンソール出力(およびDebug.Writelineなどから出力したもの)が表示されることがわかりましたが、これはafterが終了するまで利用できません。そして、数百回の繰り返しを伴う私のテストにはかなり時間がかかる可能性があるため、それがどこまで進んだかを知りたいと思います。

質問:
[出力]ウィンドウでコンソール出力を取得する方法はありますかduring test execution?

108
Julian

コンソールの出力は、バックエンドコードがテストのコンテキストで実行されていないために表示されません。

おそらくTrace.WriteLine(System.Diagnostics内)を使用してから、ファイルに書き込むトレースリスナーを追加することをお勧めします。

MSDNのこのトピック は、これを行う方法を示しています。


マーティニールとデイブアンダーソンのコメントによると:

using System;
using System.Diagnostics;

...

Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
// or Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Hello World");
105
Andras Zoltan

Debug.WriteLineを使用します。これにより、Outputウィンドウにメッセージがすぐに表示されます。唯一の制限は、テストをDebugモードで実行する必要があるということです。

[TestMethod]
public void TestMethod1()
{
    Debug.WriteLine("Time {0}", DateTime.Now);
    System.Threading.Thread.Sleep(30000);
    Debug.WriteLine("Time {0}", DateTime.Now);
}

出力

enter image description here

69
chaliasos

私自身の解決策を見つけました。 Andrasの回答はおそらくMSTESTと最も一貫していることを知っていますが、コードをリファクタリングする気はありませんでした。

[TestMethod]
public void OneIsOne()
{
    using (ConsoleRedirector cr = new ConsoleRedirector())
    {
        Assert.IsFalse(cr.ToString().Contains("New text"));
        /* call some method that writes "New text" to stdout */
        Assert.IsTrue(cr.ToString().Contains("New text"));
    }
}

使い捨てConsoleRedirectorは次のように定義されます:

internal class ConsoleRedirector : IDisposable
{
    private StringWriter _consoleOutput = new StringWriter();
    private TextWriter _originalConsoleOutput;
    public ConsoleRedirector()
    {
        this._originalConsoleOutput = Console.Out;
        Console.SetOut(_consoleOutput);
    }
    public void Dispose()
    {
        Console.SetOut(_originalConsoleOutput);
        Console.Write(this.ToString());
        this._consoleOutput.Dispose();
    }
    public override string ToString()
    {
        return this._consoleOutput.ToString();
    }
}
13
SimplyKnownAsG

同じ問題があり、テストを「実行」していました。代わりにテストを「デバッグ」すると、他のすべてのトレースおよびコンソールと同様に、デバッグ出力に問題なく表示されます。テストを「実行」した場合の出力の表示方法はわかりません。

3
Gökhan Kurt

単一のテストをセットアップし、このテストからパフォーマンステストを作成する方が適切です。この方法では、デフォルトのツールセットを使用して進行状況を監視できます。

0
riezebosch