web-dev-qa-db-ja.com

単体テストからの出力を書き込む方法は?

ユニットテストでのDebug.Write(line)またはConsole.Write(Line)の呼び出しは、デバッグ中に単にスキップされ、出力は表示されません。私が使用しているクラス内からこれらの関数を呼び出すと、うまくいきます。

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

91
Chris

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

例:

    [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 で「テストフレームワークが自動的にプロパティを設定し、ユニットテストで使用できるようになります」と説明されています。

103
frennky

会話に少し遅れました。

また、ユニットテストで動作するように、Debug、Trace、Console、またはTestContextを取得しようとしていました。

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

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

VS2012以降
(コメントから)Visual Studio 2012にはアイコンはありません。代わりに、Outputと呼ばれるリンクがテスト結果にあります。リンクをクリックすると、すべてのWriteLineが表示されます。

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

138
Yogurt The Wise

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

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

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

3)Test Explorerウィンドウで、Passed Test Methodをクリックします。

4)[出力]リンクをクリックします。

enter image description here

「出力」をクリックすると、Console.Writeline()の結果が表示されます。 enter image description here

51
monad.gon

テストランナーによって異なります...たとえば、私はXUnitを使用しているので、それが使用している場合は、次の手順に従ってください。

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

このメソッドは、特定の単体テストごとに出力をグループ化します。

 
 Xunitの使用; 
 Xunit.Abstractionsの使用; 
 
パブリッククラスMyTestClass 
 {
 private readonly ITestOutputHelper output; 
 
 public MyTestClass(ITestOutputHelper output)
 {
 this.output = output; 
} 
 
 [事実] 
 public void MyTest()
 {
 var temp = "my class!"; 
 output.WriteLine( "これは{0からの出力です} "、temp); 
} 
} 
 

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

12
jonzim

私はそれがまだ実際だと思います。

次のNuGetパッケージを使用できます。 https://www.nuget.org/packages/Bitoxygen.Testing.Pane/

このライブラリからカスタムWriteLineメソッドを呼び出します。

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

[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));
    }
}
4
Maxim

デバッグでユニットテストを実行していることを確認しますか? Debug.WriteLineは、リリースビルドでは調整されません。

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

  • Trace.WriteLine()、これはinotリリースビルドとデバッグの両方でビルドされます

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

0
Jason Williams

次の例で解決しました:

public void CheckConsoleOutput()
    {
        Console.WriteLine("Hi Hi World");
        Trace.WriteLine("Trace Trace the World");
        Debug.WriteLine("Debug Debug WOrld");
        Assert.IsTrue(true);
    }

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

0
Mike

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

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

0
Goodies

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

0
user4711269

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

0
Arthur Greef

ただこれに遭遇しました。原因/解決策は上記とは異なるバリアントなので、投稿します。
[。

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

使用してみてください:

Console.WriteLine()

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

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

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

0
VoodooChild

私はxunitを使用しているので、これは私が使用するものです:Debugger.Log(0, "1", input);

PS:Debugger.Break();を使用して、outにログインしていることを確認できます

0
Ivandro Ismael