単体テストの出力を書き込むにはどうすればよいですか?


113

単体テストでの呼び出しは、デバッグ中にスキップされるかDebug.Write(line)Console.Write(Line)単にスキップされて、出力が印刷されません。私が使用しているクラス内からのこれらの関数の呼び出しは問題なく動作します。

単体テストは自動化されていることを理解していますが、単体テストからメッセージを出力できるようにしたいのですが。

回答:


127

TestContext.WriteLine()テスト結果のテキストを出力するwhich を使用してみてください。

例:

    [TestClass]
    public class UnitTest1
    {
        private TestContext testContextInstance;

        /// <summary>
        ///  Gets or sets the test context which provides
        ///  information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get { return testContextInstance; }
            set { testContextInstance = value; }
        }

        [TestMethod]
        public void TestMethod1()
        {
            TestContext.WriteLine("Message...");
        }
    }

「マジック」は、MSDNで「テストフレームワークが自動的にプロパティを設定し、ユニットテストで使用できる」と説明されています。


7
私は(VS2013で)テストがデバッグモードで実行された場合にのみ何かを出力することを発見しました。
fusi 2015


文字列に中括弧が含まれている場合、メソッドが爆発することに気づきました。したがって、「_ testContext.WriteLine( "hello");」動作しますが、「_ testContext.WriteLine( "he {ll} o");」「System.FormatException:入力文字列が正しい形式ではありませんでした。」で失敗する
Mike K

1
TestContextのWriteLineメソッドは、Console.WriteWriteLineが取るのと同じパラメーターを取ります。つまり、文字列はフォーマット文字列です(docs.microsoft.com/en-us/dotnet/standard/base-types/…に文書化されています)。文字列でリテラル{を使用するには、それを2倍にする必要があります。文字列を印刷するには、WriteLine( "he {{ll}} o");を使用します。
Walter

1
これは興味深いものでしたが、混乱を避けるためにフレームワークから使用できる基本クラスまたはインターフェイスに、なぜこれと同様の機能を追加しなかったのかはまだわかりません。
Niklas

149

また、ユニットテストでデバッグ、トレース、コンソール、またはTestContextを機能させることも試みていました。

これらのメソッドはどれも機能していないか、出力ウィンドウに出力を表示していません。

    Trace.WriteLine("test trace");
    Debug.WriteLine("test debug");
    TestContext.WriteLine("test context");
    Console.WriteLine("test console");

Visual Studio 2012以降

(コメントより) Visual Studio 2012では、アイコンはありません。代わりに、出力と呼ばれるテスト結果にリンクがあります。リンクをクリックすると、すべてが表示されますWriteLine

Visual Studio 2012より前

次に、[ テスト結果]ウィンドウで、テストを実行した後、小さな成功の緑色の円の横に別のアイコンがあることに気付きました。ダブルクリックしました。これは私のテスト結果であり、上記のすべてのタイプの書き込みラインが含まれていました。


44
Visual Studio 2012では、アイコンはありません。代わりに、「出力」というテスト結果にリンクがあります。リンクをクリックすると、すべての書き込みラインが表示されます。
エポッター2013

16
ねえ、その「出力」リンクは本質的に見つけるのが難しい。誰かがそれを見つけるのに苦労している場合、それはテキストエクスプローラーの下部セクションにあります。テストを選択すると、「経過時間:xxx」の結果が表示されます。その下には「出力」リンクがあります。
ケビン2014年

@kevin、どのバージョンのVSでそれを見ましたか?(私はあなたの代わりにテキストエクスプローラ」の「テストエクスプローラ」を意味すると仮定しています。)私はVS2013 Expressの出力リンクが表示されません。
マイク・C

1
これらのどれがTRX(テスト結果出力)ファイルに表示されるのか(私のように)疑問に思っている場合、「Debug.WriteLine」を除いて上記のすべてです。
Badgerspot

4
Visual Studio 2017では、これは「出力」リンクのままです。
HankCa、2018年

66

Visual Studio 2017では、テストエクスプローラーからの出力を確認できます。

1)テストメソッドで、Console.WriteLine( "something");

2)テストを実行します。

3)「テストエクスプローラー」ウィンドウで、「合格したテストメソッド」をクリックします。

4)「出力」リンクをクリックします。

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

「出力」をクリックすると、Console.Writeline()の結果が表示されます。 ここに画像の説明を入力してください


1
優れた。Visual Studio / C#は開発の標準ではありません。これは私が必要としていることです。これを投稿していただきありがとうございます。
matt32

10
2017バージョン15.5.6を使用しています。ビットO出力リンクが表示されません。
Mike IT

1
使用しているテストフレームワークに依存しますか?.NET 4.6テストプロジェクトでxUnit 2.4を使用していますが、「標準出力」ペインが表示されません。からConsole.WriteLineの出力は、[テスト]の下の[出力]ペインにも表示されません。
Qwertie

xUnitの場合、テストによって生成された別のスレッドでも、Jonzimの答えはうまくいきました。
Qwertie

1
それらのために「出力」リンクを見なかった。1)テスト方法を選択する必要があります。2)テストエクスプローラーウィンドウをVSウィンドウに垂直方向に表示させます。そうしないと、リンクが非表示になり、スクロールバーが小さすぎて気づいたり使用したりできません。
ニャー猫2012年

18

それはあなたのテストランナーに依存します...たとえば、私はxUnitを使用しているので、それがあなたが使用しているものである場合は、次の指示に従ってください:

https://xunit.github.io/docs/capturing-output.html

この方法では、出力を特定の単体テストごとにグループ化します。

using Xunit;
using Xunit.Abstractions;

public class MyTestClass
{
    private readonly ITestOutputHelper output;

    public MyTestClass(ITestOutputHelper output)
    {
        this.output = output;
    }

    [Fact]
    public void MyTest()
    {
        var temp = "my class!";
        output.WriteLine("This is output from {0}", temp);
    }
}

出力ウィンドウへの書き込み用に提供したリンクには別の方法がリストされていますが、私は前の方法を好みます。


4

まだ実際だと思います。

このNuGetパッケージを使用できます。 Bitoxygen.Testing.Pane

このライブラリからカスタムWriteLineメソッドを呼び出します。内部にテストペインを作成します出力ウィンドウメッセージを常にそこに配置します(各テスト中、DEBUGフラグとTRACEフラグとは独立して実行されます)。

トレースをより簡単にするために、基本クラスを作成することをお勧めします。

[TestClass]
public abstract class BaseTest
{
    #region Properties
    public TestContext TestContext { get; set; }

    public string Class
    {
        get { return this.TestContext.FullyQualifiedTestClassName; }
    }
    public string Method
    {
        get { return this.TestContext.TestName; }
    }
    #endregion

    #region Methods
    protected virtual void Trace(string message)
    {
        System.Diagnostics.Trace.WriteLine(message);

        Output.Testing.Trace.WriteLine(message);
    }
    #endregion
}

[TestClass]
public class SomeTest : BaseTest
{
    [TestMethod]
    public void SomeTest1()
    {
        this.Trace(string.Format("Yeah: {0} and {1}", this.Class, this.Method));
    }
}

1
魔法は次のとおりです。Output.Testing.Trace.WriteLine(message); BitOxygenで。
Bimal Poudel 16

現在のVisual Studioバージョンでは機能しません。エラーが発生しますCould not load file or assembly 'Microsoft.VisualStudio.Shell.12.0,
コンソール

@Consoleはい、ある程度のサポートが必要ですが、コミュニティがこのように出力することに興味があるかどうかはわかりません。xUnitにはOutputHandlerがあり、VSはその結果を表示できます。
マキシム

1

使ってみてください:

Console.WriteLine()

への呼び出しDebug.WriteLineは、DEBUGが定義されているときにのみ行われます。

他の提案は使用することです:Trace.WriteLine同様に、しかし私はこれを試していません。

オプションもあります(Visual Studio 2008にあるかどうかはわかりません)が、IDE Debug.WriteLineTest With Debuggerオプションを指定してテストを実行するときに引き続き使用できます。


1

次の例で解決します:

public void CheckConsoleOutput()
{
    Console.WriteLine("Hello, World!");
    Trace.WriteLine("Trace Trace the World");
    Debug.WriteLine("Debug Debug World");
    Assert.IsTrue(true);
}

このテストを実行した後、[テストに合格しました]の下に、出力ウィンドウを表示する出力を表示するオプションがあります。


1

@jonzimが述べたように、それは確かにテストランナーに依存しています。NUnit 3の場合NUnit.Framework.TestContext.Progress.WriteLine()、Visual Studio 2017の出力ウィンドウで出力を実行するために使用する必要がありました。

NUnitは次の方法を説明します:ここ

私の理解では、これは、テストランナーが受け取ったテスト実行の追加の並列化に関係しています。


0

テスト/テスト設定/デフォルトのプロセッサアーキテクチャ設定と、テストプロジェクトが参照するアセンブリが同じでない場合、出力がありません。それ以外の場合、Trace.Writeline()は正常に動作します。


0

Console.WriteLineは機能しません。デバッグモードでは、Debug.WriteLine()またはTrace.WriteLine()のみが機能します。

テストモジュールでSystem.Diagnosticsの使用を含めます。次に、出力にDebug.WriteLineを使用し、テストを右クリックして、[ 選択したテストのデバッグ]を選択します。結果の出力は、下の[出力]ウィンドウに表示されます。Visual Studio 2017と15.8.1を使用し、VSが提供するデフォルトの単体テストフレームワークを使用します。


0

ユニットテストをデバッグで実行していますか?Debug.WriteLineはリリースビルドでは呼び出されません。

試す2つのオプションは次のとおりです。

  • Trace.WriteLine()、リリースビルドとデバッグに組み込まれています

  • 単体テストのビルド設定でデバッグの定義を解除します


0

私はxUnitを使用しているので、これは私が使用するものです:

Debugger.Log(0, "1", input);

PS:あなたも使用できるDebugger.Break();ので、ログインを見ることができますout


これは何ですか " out"?
Peter Mortensen、

0

原因/解決策の別のバリアント:

私の問題は、非同期LINQ呼び出しからの結果セットを非同期コンテキストのループでコンソールに書き込んでいたため、出力が得られなかったことでした。

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345");

p.ForEachAsync(payment => Console.WriteLine(payment.Amount));

そのため、コンソールオブジェクトがランタイムによってクリーンアップされる前に、テストはコンソールに書き込みませんでした(1つのテストのみを実行する場合)。

解決策は、最初に結果セットをリストに変換することだったので、非同期バージョンのforEach()を使用できました。

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345").ToList();

p.ForEachAsync(payment =>Console.WriteLine(payment.Amount));

0

VS 2019

  1. メインVSメニューバーで次のようにクリックします。 View >Test Explorer
  2. テストエクスプローラー->デバッグでテストメソッドを右クリック
  3. additional output下のスクリーンショットにあるリンクをクリックしてください。

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

以下を使用できます。

  • Debug.WriteLine
  • Console.WriteLine
  • TestContext.WriteLine

すべてが追加の出力ウィンドウに記録します。


-1

Trace.WriteLine正しい出力([出力] ウィンドウにある[ 出力元の表示]というラベルの付いたドロップダウン)を選択すれば、動作するはずです。

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