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


113

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

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

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

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

質問:テストの実行
に[出力]ウィンドウでコンソール出力を取得する方法はありますか?


テスト結果の出力に出力する方法を探す場合: stackoverflow.com/a/4787047/621690
Risadinha

回答:


110

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

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");

72
基本的に、 Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Marty Nealは

7
うーん、私は@Martinニールの提案が両方送信する発見だTrace.WriteLine()Console.WriteLine()に出力をテストビュー結果いない出力ビュー。(中にいること、およびノートテストビュー結果、追加する必要があるかもしれ出力(stdout)を右クリックして選択することで、列を...追加/削除列をしかし、おそらく私はまだで、出力が表示されません。)出力ビューは、何かが欠けていることを意味します...
DavidRR

2
Trace.Listeners.Add(new ConsoleTraceListener());十分であり、デバッグからの出力を出力ウィンドウに表示します。
デイブアンダーソン

3
VS2017で実際に出力を見つけるのに苦労していました... TestExplorerウィンドウ->個々のテストをクリックします->テストに出力があった場合、経過時間の下の詳細ウィンドウに、「出力」へのリンクがあります新しいウィンドウ。
マイクウォルシュ

1
Xunitを使用している場合は、ctorを介してITestOutputHelperを受け取り、WriteLineを呼び出します。統合テスト中に書く方法を見つけるまでに少し時間がかかりましたが、これが誰かの役に立つことを願っています。
AlexanderHøst19年

69

を使用し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);
}

出力

ここに画像の説明を入力してください


8
必要using System.Diagnostics;
kmote 2013年

4
DateTime.Nowは使用しないでください。ストップウォッチ(msdn.microsoft.com/en-us/library/…)を使用することをお
勧めします

1
これを機能させることができませんでした。テストを実行すると、出力ウィンドウはすぐにビルドに切り替わり、デバッグには何も送信されません。あなたの考え?
InteXX

5
@InteXXは、「テストの実行」ではなく「テストのデバッグ」をクリックするようにしてください。それは私のために働きました
ジョン・ヘンケル

@JohnHenckel:おっと。ありがとう。そうします。実際、シャリアソスはまさにその答えを彼の答えで述べています。どのようにそれを逃したかわからない。
InteXX、2015年

13

私は自分の解決策を見つけました。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();
    }
}

3

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


System.Diagnostics.Debug.WriteLineテストのデバッグ中に使用するものを表示することはできますが、どのようConsole.WriteLineに作業しますか これは、通常の(ライブ更新された)出力にはなりません。
またはMapper 2017

テストの実行中に出力を確認する方法を見つけましたか?
hima

0

単一のテストをセットアップし、このテストからパフォーマンステストを作成することをお勧めします。このように、デフォルトのツールセットを使用して進行状況を監視できます。


「この方法で、デフォルトのツールセットを使用して進行状況を監視できます。」- どうやって?私が目にしている問題は、テストが実行されるとブラックボックスになり、テストの実行が終了した後、出力ウィンドウに出力(テストの実行中に徐々に書き込んでいる)だけが表示されることです。。
またはMapper 2017

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.