単体テストでコンソールに書き込むことはできますか?はいの場合、コンソールウィンドウが開かないのはなぜですか?


148

Visual Studioにテストプロジェクトがあります。私はMicrosoft.VisualStudio.TestTools.UnitTestingを使用しています

この行を単体テストの1つに追加します。

Console.WriteLine("Some foo was very angry with boo");
Console.ReadLine();

テストを実行すると、テストはパスしますが、コンソールウィンドウがまったく開かれません。

単体テストを介してコンソールウィンドウを操作できるようにする方法はありますか?


1
それは本当にランナー次第です。TestDriven.Netを使用できます(すばらしい、個人使用には無料、テストランナー)。Console.WriteLineはVS出力ペインに書き込みます。
セダリー


NCrunchにもこの機能があり、それだけで価格はIMOの価値があります。Dumpオブジェクトのコンテンツをコンソールに出力する拡張メソッドがあるので、デバッグが非常に簡単になります。i.imgur.com/MEZwy7X.png
DharmaTurtle

回答:


125

注:以下の元の回答は、Visual Studio 2012までのすべてのバージョンのVisual Studioで機能します。VisualStudio 2013では、[テスト結果]ウィンドウが表示されなくなりました。代わりに、テスト固有の出力が必要な場合は、@ Stretchの提案を使用Trace.Write()して、出力ウィンドウに出力を書き込むことができます。


このConsole.Writeメソッドは「コンソール」に書き込みません-実行中のプロセスの標準出力ハンドルに接続されているものに書き込みます。同様Console.Readに、標準入力に接続されているものから入力を読み取ります。

Visual Studio 2010を通じて単体テストを実行すると、標準出力はテストハーネスによってリダイレクトされ、テスト出力の一部として保存されます。これは、[テスト結果]ウィンドウを右クリックして、 "出力(StdOut)"という名前の列を表示に追加することで確認できます。これにより、標準出力に書き込まれたすべてが表示されます。

sinni800が言うようにP / Invokeを使用して、手動でコンソールウィンドウを開くことができます。ドキュメントを読むと、関数がリセットされ、AllocConsolestdinstdout新しいコンソールウィンドウにポイントへのハンドル。(私はそれについて100%確信stdoutがありません。私がWindowsから私にそれを盗むためにすでにリダイレクトした場合、それは私には一種の間違っているようですが、私は試していません。)

しかし、一般的には、それは悪い考えだと思います。コンソールを使用してユニットテストに関する詳細情報をダンプするだけの場合は、出力が表示されます。Console.WriteLineそのまま使用し、完了したら[テスト結果]ウィンドウで出力結果を確認します。


AllocConsoleを使用して新しいWindowsApplicationを開き、コンソールを割り当てると、そこに書き込まれます。それが実際に何をしているのかはわかりませんが、単体テスト環境では機能しない可能性があります。それは本当に知っていると本当にいいです...
sinni800

人事。AllocConsoleドキュメンテーションを再読すると、私は正しくないかもしれませんが、テストする必要があります。
マイケルエデンフィールド、2012年

2
私にとって、Michaelからのこのコメントは、私が考える必要があるすべてのことを言いました:「VS2010を通じて単体テストを実行すると、標準出力はテストハーネスによってリダイレクトされ、テスト出力の一部として保存されます。」
Robert Patterson、

5
VS2013では、コンソールで書き込みを行うと、TestExplorer / Test / Summaryに[Output]リンクラベルが表示されます。それをクリックすると、目的の出力が得られます。待つ?Console.ReadLine()も呼び出しますか?
Visar

3
V2017(コミュニティ)で、「テストエクスプローラー」に移動し、リストからテスト結果項目を選択して、別のウィンドウ(テスト結果ウィンドウ?)で「出力」リンクをクリックします。おそらく切り捨てられるので、「すべてコピー」を使用して、どこか他の場所を通過します。
ヘリンガー

180

誰かがVisual Studio 2013のこの明らかに新しい機能についてコメントしました。最初は彼が何を意味するのかわかりませんでした。

通常はConsole.WriteLineを使用でき、出力は出力ウィンドウだけでなく、テストの詳細で[出力]をクリックすると新しいウィンドウに表示されます。

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


2
優れたソリューション。VS2015 Enterpriseで機能することを確認します。
garfbradaz 2017

6
残念ながら、コピーアンドペースト用にその出力領域のテキストを選択することはできません:(彼らは何を考えていましたか?!
またはMapper

3
@ORMapper、[標準出力]領域を右クリックして[すべてコピー]を選択
bychance

2
@ Ovi-WanKenobiがConsole.Writeで何かを出力してみる
Tiago Duarte

5
2017年と比較して、実行する各テストを選択し、[出力]をクリックする必要があります。テスト数が多い場合はあまり役に立ちません。個別のウィンドウではなく、すべての出力をまとめて表示したい。
inliner49er

37

次の行を使用して、Visual Studioの出力ウィンドウに書き込むことができます。

System.Diagnostics.Debug.WriteLine("Matrix has you...");

デバッグモードで実行する必要があります。


7
それは私のVSに書いていない
Luis Filipe

1
詳細については、このスレッドをチェック- stackoverflow.com/questions/1159755/...
ドミトリー・パヴロフ

1
これは、MSTestとR#を使用して出力を表示するのに役立ちました。ありがとう!
Isaac Baker

2
@Williamテストをデバッグする場合に表示されますが、デバッグせずに単に実行する場合は表示されません。
ヨーヨー

29

述べたように、単体テストは対話なしで実行するように設計されています。

ただし、他のコードと同じように、単体テストをデバッグできます。最も簡単な方法は、Debug [テスト結果]タブのボタンです。

デバッグできるということは、ブレークポイントを使用できるということです。つまり、ブレークポイントを使用できるということは、トレースポイントを使用できるということです。。これは、毎日のデバッグで非常に役立ちます。

基本的に、トレースポイントを使用すると、出力に書き込むことができますウィンドウ(正確には標準出力)。オプションで、実行を継続することも、通常のブレークポイントのように停止することもできます。これにより、コードを再構築したり、デバッグ情報を入力したりすることなく、必要な「機能」を利用できます。

ブレークポイントを追加して、そのブレークポイントを右クリックするだけです。「ヒット時...」オプションを選択します。

オプションを打ったとき

ダイアログが表示されます:

ブレークポイントにヒットしたとき

注意すべきいくつかの事柄:

  1. ブレークポイントが球ではなくひし形で表示され、トレースポイントを示していることに注意してください。
  2. 変数の値は、{this}のように囲んで出力できます。
  3. 通常のブレークポイントと同様に、[実行を続行]チェックボックスをオフにして、この行でコードを中断します。
  4. マクロを実行するオプションがあります。注意してください-有害な副作用を引き起こす可能性があります。

詳細については、ドキュメントを参照してください。


24

C#でVisual Studio単体テストからの出力を書き込む方法はいくつかあります。

  • Console.Write-Visual Explorerテストハーネスはこれをキャプチャし、テストエクスプローラーでテストを選択して[出力]リンクをクリックすると表示されます。んではないのいずれか実行しているか、ユニットテストをデバッグすると、Visual Studioの出力ウィンドウに表示(間違いなくこれはバグです)。
  • Debug.Write-Visual Studioテストハーネスがこれをキャプチャし、テスト出力に表示します。するユニットテストをデバッグするときにVisual Studioの出力ウィンドウに表示されが、Visual Studioのデバッグオプションが出力をイミディエイトウィンドウにリダイレクトするように構成されている場合を除きます。デバッグせずにテストを実行しただけでは、出力(またはイミディエイト)ウィンドウには何も表示されません。デフォルトでは、デバッグビルドでのみ使用できます(つまり、DEBUG定数が定義されている場合)。
  • Trace.Write-Visual Studioテストハーネスがこれをキャプチャし、テスト出力に表示します。単体テストをデバッグするときにVisual Studioの出力(またはイミディエイト)ウィンドウに表示されます(ただし、デバッグせずにテストを実行するだけで表示されません)。デフォルトでは、デバッグビルドとリリースビルドの両方で使用できます(つまり、TRACE定数が定義されている場合)。

Visual Studio 2013 Professionalで確認済み。


1
組み込みのMicrosoftテストフレームワークではなく、Visual StudioのNUnitおよびNUnit Test Adapter拡張機能を使用する場合、ルールは少し異なることに注意してください。
ヨーヨー

9

使用できます

Trace.WriteLine()

単体テストのデバッグ時に出力ウィンドウに書き込む。


5

Visual Studio 2017では、「TestContext」はテストエクスプローラーへの出力リンクを表示しません。

ただし、Trace.Writeline()には出力リンクが表示されます。


ただ
参考までに

4

まず最初に、ユニットテストは仕様上、完全に対話なしで実行されるようになっています。

それはさておき、考えられた可能性はないと思います。

現在のアプリケーションがGUIアプリケーションである場合でもコンソールを開くAllocConsole P / Invokeを使用してハッキングを試すことができます。Consoleこのクラスは、今開かれたコンソールに掲載します。


1
うーん..私の主な動機は、コンソールに追加のデータを書き込んで詳細を確認することです。後で必要ないかもしれないアドホックなものになります。
pencilCake


2

私見、出力メッセージはほとんどの場合、失敗したテストケースにのみ関連しています。以下のフォーマットを作りましたが、あなたも自分で作ることができます。これは、Visual Studioテストエクスプローラーウィンドウ自体に表示されます。

このメッセージをVisual Studioテストエクスプローラーウィンドウにスローするにはどうすればよいですか?

このようなサンプルコードは機能するはずです。

if(test_condition_fails)
    Assert.Fail(@"Test Type: Positive/Negative.
                Mock Properties: someclass.propertyOne: True
                someclass.propertyTwo: True
                Test Properties: someclass.testPropertyOne: True
                someclass.testPropertyOne: False
                Reason for Failure: The Mail was not sent on Success Task completion.");

あなたはあなたのためにこれに専用の別のクラスを持つことができます。


私もこれを追加すると思いました。XUNITを使用するVisual Studio 2019では、次のことを実行できます。Assert.True(success、 "DELETE RECORD FAILED"); DELETE RECORD FAILEDがVS 2019 Test Explorerに表示されます。繰り返しになりますが、上記の回答と同様に、これはユニットテストが予期された条件に失敗した場合にのみ機能します。
TroySteven

1

私はより簡単な解決策を持っています(私は最近、多くの怠惰な理由で自分自身を使用しました)。このメソッドを、作業中のクラスに追加します。

public static void DumbDebug(string message)
{
    File.WriteAllText(@"C:\AdHocConsole\" + message + ".txt", "this is really dumb. I wish Microsoft had more obvious solutions to its solutions problems.");
}

次に、ディレクトリAdHocConsoleを開き、作成された時間順に並べます。「印刷ステートメント」を追加するときに確認してください。彼らは違いますが、そうでなければジャグリングがあります。


0

Mac用のVisual Studio

他のソリューションはいずれもVisual Studio for Macで機能しませんでした

NUnitを使用している場合は、小さな.NET コンソールプロジェクトをソリューションに追加し、テストするプロジェクトをその新しいコンソールプロジェクトの参照参照できます。

[Test()]メソッドで実行していたことはすべてMain、コンソールアプリケーションので次のように実行できます。

class MainClass
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Console");

        // Reproduce the unit test
        var classToTest = new ClassToTest();
        var expected = 42;
        var actual = classToTest.MeaningOfLife();
        Console.WriteLine($"Pass: {expected.Equals(actual)}, expected={expected}, actual={actual}");
    }
}

あなたは自由に使用できますConsole.Writeし、Console.WriteLineこのような状況の下で、あなたのコードインチ

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