단위 테스트에서 출력을 작성하려면 어떻게해야합니까?


113

내 단위 테스트의 모든 호출은 디버깅 중에 건너 뛰 Debug.Write(line)거나 Console.Write(Line)출력이 인쇄되지 않습니다. 내가 사용하는 클래스 내에서 이러한 함수를 호출하면 잘 작동합니다.

단위 테스트가 자동화된다는 것을 이해하지만 여전히 단위 테스트에서 메시지를 출력하고 싶습니다.

답변:


128

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 에서 "테스트 프레임 워크가 자동으로 속성을 설정하므로 단위 테스트에서 사용할 수 있습니다."라고 설명되어 있습니다.


7
나는 (VS2013과 함께) 테스트가 디버그 모드에서 실행되는 경우에만 무언가를 인쇄한다는 것을 발견했습니다.
fusi

3
TestContext를 사용하여에 따라, VS2015 기업 (또는 이전 버전의 프리미엄 버전)이 필요하다는 것 이 문서
패트릭 스테 드먼에게

문자열에 중괄호가 있으면 메서드가 폭발한다는 것을 알았습니다. 그래서 "_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/…에 문서화 ) 임을 의미합니다 . 문자열에서 리터럴 {을 사용하려면 두 배로해야합니다. 문자열을 인쇄하려면 WriteLine ( "he {{ll}} o");
Walter

1
이것은 흥미로 웠습니다 ... 비록 그들이 혼동을 피하기 위해 프레임 워크에서 사용할 수있는 기본 클래스 나 인터페이스에이 기능과 유사한 기능을 추가하지 않은 이유를 아직 모르겠습니다.
Niklas

149

또한 단위 테스트에서 작동하도록 Debug 또는 Trace 또는 Console 또는 TestContext를 가져 오려고했습니다.

다음 방법 중 어느 것도 출력 창에 작동하거나 출력을 표시하는 것처럼 보이지 않습니다.

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

Visual Studio 2012 이상

(댓글에서) Visual Studio 2012에는 아이콘이 없습니다. 대신 테스트 결과에 Output 이라는 링크가 있습니다. 링크를 클릭하면 모든 WriteLine.

Visual Studio 2012 이전

그런 다음 테스트 결과 창에서 테스트를 실행 한 후 작은 성공 녹색 원 옆에 다른 아이콘이 있음을 알았습니다 . 두 번 클릭했습니다. 그것은 내 테스트 결과였으며 위의 모든 유형의 글쓰기를 포함했습니다.


44
Visual Studio 2012에는 아이콘이 없습니다. 대신 테스트 결과에 "출력"이라는 링크가 있습니다. 링크를 클릭하면 모든 글쓰기 라인을 볼 수 있습니다.
epotter 2013-04-25

16
"출력"링크는 본질적으로 찾기가 어렵습니다. 누군가 그것을 찾는 데 어려움을 겪고 있다면 그것은 텍스트 탐색기의 하단 섹션에 있습니다. 테스트를 선택하면 "경과 시간 : xxx"와 함께 결과가 표시됩니다. 그 아래는 "출력"링크입니다.
kevin 2014 년

@kevin, 어떤 버전의 VS에서 보았습니까? (난 당신이 대신 텍스트 탐색기 "의"테스트 탐색기 "를 의미 있으리라 믿고있어.) 내가 VS2013 익스프레스에 출력 링크가 표시되지 않습니다.
마이크 C

1
TRX (테스트 결과 출력) 파일에 이들 중 어떤 것이 나타나는지 (나와 같은) 궁금한 사람이 있다면 "Debug.WriteLine"을 제외하고 위의 모든 것입니다.
Badgerspot

4
Visual Studio 2017에서는 여전히 '출력'링크입니다.
HankCa

66

Visual Studio 2017에서는 테스트 탐색기의 출력을 볼 수 있습니다.

1) 테스트 메서드에서 Console.WriteLine ( "something");

2) 테스트를 실행합니다.

3) Test Explorer 창에서 Passed Test Method를 클릭합니다.

4) "출력"링크를 클릭합니다.

여기에 이미지 설명 입력

"출력"을 클릭하면 Console.Writeline ()의 결과를 볼 수 있습니다. 여기에 이미지 설명 입력


1
우수한. Visual Studio / C #은 개발을위한 제 표준이 아닙니다. 게시 해주셔서 감사합니다.
matt32

10
2017 버전 15.5.6을 사용하고 있습니다. Bit O에 출력 링크가 표시되지 않습니다.
Mike IT

1
사용중인 테스트 프레임 워크에 따라 달라 집니까? .NET 4.6 테스트 프로젝트에서 xUnit 2.4를 사용하고 있는데 "표준 출력"창이 나타나지 않습니다. 출력은 Console.WriteLine"테스트"아래의 출력 창에도 표시되지 않습니다.
Qwertie

xUnit의 경우 jonzim의 답변은 테스트에 의해 생성 된 다른 스레드에서도 저에게 효과적이었습니다.
Qwertie 19-06-04

1
그들에게는 "출력"링크가 보이지 않았습니다. 1) 테스트 방법을 선택해야합니다 . 2) 테스트 탐색기 창을 VS 창을 세로로 채우십시오. 그렇지 않으면 링크가 숨겨지고 스크롤 막대가 너무 작아서 눈에 띄거나 사용할 수 없습니다.
Meow Cat 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 2016 년

현재 Visual Studio 버전에서 작동하지 않는 경우 오류가 발생합니다Could not load file or assembly 'Microsoft.VisualStudio.Shell.12.0,
Console

@Console 예, 약간의 지원이 필요하지만 커뮤니티가 이런 식으로 출력하는 데 흥미로운 지 확실하지 않습니다. xUnit에는 OutputHandler가 있으며 VS는 결과를 표시 할 수 있습니다.
Maxim

1

다음을 사용해보십시오.

Console.WriteLine()

에 대한 호출 Debug.WriteLine은 DEBUG가 정의 된 동안에 만 이루어집니다.

다른 제안도 사용하는 Trace.WriteLine것이지만 시도해 보지 않았습니다.

옵션도 있지만 (Visual Studio 2008에 있는지 확실하지 않음) IDE에서 옵션으로 Debug.WriteLine테스트를 실행할 때 여전히 사용할 수 있습니다 Test With Debugger.


1

다음 예제로 해결되었습니다.

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

이 테스트를 실행 한 후 'Test Passed'아래에 출력을 볼 수있는 옵션이 있으며 출력 창이 나타납니다.


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을 사용 하고 test를 마우스 오른쪽 버튼으로 클릭 한 다음 Debug Selected Tests를 선택합니다 . 이제 결과 출력이 아래 출력 창에 나타납니다. VS에서 제공하는 기본 단위 테스트 프레임 워크와 함께 Visual Studio 2017 vs 15.8.1을 사용합니다.


0

디버그에서 단위 테스트를 실행하고 있습니까? Debug.WriteLine 은 릴리스 빌드에서 호출되지 않습니다.

시도 할 수있는 두 가지 옵션은 다음과 같습니다.

  • Trace.WriteLine (), 릴리스 빌드 및 디버그에 내장 됨

  • 단위 테스트를위한 빌드 설정에서 DEBUG 정의 해제


0

나는 xUnit을 사용하고 있으므로 이것이 내가 사용하는 것입니다.

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

추신 : 당신도 사용할 수 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));

따라서 콘솔 개체가 런타임에 의해 정리되기 전에 테스트가 콘솔에 기록되지 않았습니다 (하나의 테스트 만 실행하는 경우).

해결책은 먼저 결과 집합을 목록으로 변환하는 것이 었으므로 비동기 버전의 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.