단위 테스트에서 콘솔에 쓸 수 있습니까? 그렇다면 왜 콘솔 창이 열리지 않습니까?


148

Visual Studio에 테스트 프로젝트가 있습니다. Microsoft.VisualStudio.TestTools.UnitTesting을 사용합니다.

이 줄을 단위 테스트 중 하나에 추가합니다.

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

테스트를 실행할 때 테스트는 통과하지만 콘솔 창이 전혀 열리지 않습니다.

단위 테스트를 통해 콘솔 창을 상호 작용할 수있는 방법이 있습니까?


1
그것은 실제로 러너에 달려 있습니다. TestDriven.Net (개인용으로 무료, 테스트 러너 무료)을 사용할 수 있습니다-Console.WriteLine은 VS 출력 창에 기록합니다.
elded

1
TestDriven.Net에 단어를 전파 해 주셔서 감사합니다
GrayFox374

NCrunch는 또한이 기능을 가지고 있으며, 이는 가격 대비 IMO의 가치가 있습니다. Dump객체의 내용을 콘솔에 출력 하는 확장 방법이있어 디버깅하기가 훨씬 쉽습니다. i.imgur.com/MEZwy7X.png
DharmaTurtle

답변:


125

참고 : 아래의 원래 답변은 VS2012까지의 모든 VS 버전에서 작동합니다. VS2013에는 더 이상 테스트 결과 창이 없습니다. 대신 테스트 별 출력이 필요한 경우 @Stretch의 제안을 사용 Trace.Write()하여 출력을 출력 창에 쓸 수 있습니다.


Console.Write메서드는 "콘솔"에 쓰지 않습니다. 실행중인 프로세스의 표준 출력 핸들에 연결된 모든 것에 씁니다. 마찬가지로 Console.Read표준 입력에 연결된 모든 것에서 입력을 읽습니다.

VS2010을 통해 단위 테스트를 실행하면 표준 출력이 테스트 하네스에 의해 리디렉션되고 테스트 출력의 일부로 저장됩니다. Test Results 창을 마우스 오른쪽 버튼으로 클릭하고 "Output (StdOut)"열을 디스플레이에 추가하면이 정보를 볼 수 있습니다. 이것은 stdout에 쓰여진 모든 것을 보여줄 것입니다.

당신은 할 수 수동 @ sinni800 말한대로 P / 호출을 사용하여 콘솔 창을 엽니 다. AllocConsole설명서를 읽으면 기능이 재설정 stdin되고 stdout새 콘솔 창을 가리 키도록 처리됩니다. (나는 그것에 대해 100 % 확신하지 못합니다. stdoutWindows에서 Windows를 도용하기 위해 이미 리디렉션 했지만 시도하지 않은 경우 다소 잘못된 것 같습니다 .)

그러나 일반적으로 나쁜 생각이라고 생각합니다. 콘솔을 사용하기 위해 유닛 테스트에 대한 추가 정보를 덤프하는 것만으로도 출력이 제공됩니다. 그대로 사용 Console.WriteLine하고 테스트 결과 창에서 출력 결과를 확인하십시오.


AllocConsole을 사용하여 콘솔을 할당하여 새 Windows 응용 프로그램을 열어 보면 콘솔이 작성됩니다. 그것이 실제로 무엇을하는지 모르지만 단위 테스트 환경에서는 작동하지 않을 수 있습니다. 정말 알아두면 좋을 것
같습니다

시간 AllocConsole문서를 다시 읽으면 틀릴 수도 있지만 테스트해야합니다.
Michael Edenfield

2
저에게 Michael의 의견은 "VS2010을 통해 단위 테스트를 실행할 때 표준 출력이 테스트 하네스에 의해 리디렉션되고 테스트 출력의 일부로 저장됩니다"라고 생각했습니다.
Robert Patterson

5
VS2013에서 콘솔에 쓸 경우 TestExplorer / Test / Summary에 [Output] 링크 레이블이 있습니다. 그것을 클릭하면 원하는 출력을 얻습니다. 기다림? Console.ReadLine ()을 호출하고 싶습니까 ??
Visar

3
V2017 (커뮤니티)에서 "테스트 탐색기"로 이동하여 목록에서 테스트 결과 항목을 선택한 다음 다른 창 (테스트 결과 창?)에서 "출력"링크를 클릭하십시오. 잘릴 수 있으므로 "모두 복사"를 사용하고 다른 곳을 지나서 사용하십시오.
heringer

180

누군가 VS2013의이 새로운 기능에 대해 언급했습니다. 나는 그가 처음에 무엇을 의미하는지 확신하지 못했지만 이제는 내가 할 수 있다고 생각합니다.

Console.WriteLine을 정상적으로 사용할 수 있으며 출력은 테스트 창에서가 아니라 테스트 세부 사항에서 "출력"을 클릭하면 새 창이 나타납니다.

여기에 이미지 설명을 입력하십시오


2
탁월한 솔루션. VS2015 Enterprise에서 작동하는지 확인하십시오.
garfbradaz

6
불행하게도, 하나는?! 그들이 무슨 생각 :( 복사 및 붙여 넣기에 대한 출력하는 영역에 텍스트를 선택할 수 없습니다
OR 매퍼

3
@ORMapper에서 "표준 출력"영역을 마우스 오른쪽 버튼으로 클릭하고 모두 복사를 선택하십시오.
bychance

2
@ Ovi-WanKenobi Console.Write로 무언가를 출력 해보십시오
Tiago Duarte

5
2017 년과 비교할 때마다 실행되는 EACH 테스트를 선택한 다음 출력을 클릭해야합니다. 테스트가 많을 때는 그다지 유용하지 않습니다. 별도의 창이 아닌 모든 출력을 함께보고 싶습니다.
inliner49er 2016 년

37

이 줄을 사용 하여 Visual Studio의 출력 창 에 쓸 수 있습니다 .

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

디버그 모드에서 실행해야합니다.


7
내 VS에 글을 쓰지 않습니다
Luis Filipe

1
자세한 내용은이 스레드를 확인하십시오.- stackoverflow.com
Dmitry Pavlov

1
이것은 MSTest와 R #을 사용하여 출력을 보는 데 효과적이었습니다. 감사!
Isaac Baker

2
@William 테스트를 디버깅하면 표시되지만 디버깅하지 않고 단순히 실행하면 표시되지 않습니다.
yoyo

29

언급 한 바와 같이 단위 테스트는 상호 작용없이 실행되도록 설계되었습니다.

그러나 다른 코드와 마찬가지로 단위 테스트를 디버그 할 수 있습니다. 가장 쉬운 방법은 테스트 결과 탭에서 디버그 버튼을 사용하는 것입니다.

디버그 할 수 있다는 것은 중단 점을 사용할 수 있음을 의미합니다. 중단 점을 사용할 수 있다는 것은 Tracepoints 를 사용할 수 있다는 것을 의미하며 , 매일 디버깅에 매우 유용합니다.

기본적으로 추적 점을 사용하면 출력 창 (또는보다 정확하게는 표준 출력)에 쓸 수 있습니다. 선택적으로 계속 실행하거나 일반 중단 점처럼 중지 할 수 있습니다. 이를 통해 코드를 다시 작성하거나 디버그 정보로 채울 필요없이 원하는 "기능"을 얻을 수 있습니다.

중단 점을 추가 한 다음 해당 중단 점을 마우스 오른쪽 단추로 클릭하십시오. "히트시 ..."옵션을 선택하십시오. 때 옵션

대화 상자가 나타납니다. 중단 점에 도달 한 경우

몇 가지 참고할 사항 :

  1. 중단 점이 이제 구형 대신 다이아몬드로 표시되어 추적 점을 나타냅니다.
  2. {this}와 같이 변수를 묶어 변수의 값을 출력 할 수 있습니다.
  3. "계속 실행"체크 상자를 선택 해제하여 일반 중단 점과 같이이 줄에서 코드를 끊으십시오.
  4. 매크로를 실행할 수있는 옵션이 있습니다. 주의하십시오-유해한 부작용을 일으킬 수 있습니다.

자세한 내용은 설명서를 참조하십시오.


24

C #에서 Visual Studio 단위 테스트의 출력을 작성하는 방법에는 여러 가지가 있습니다.

  • Console.Write-Visual Studio 테스트 하니스가이를 캡처하여 테스트 탐색기에서 테스트를 선택하고 출력 링크를 클릭하면 표시합니다. 않습니다 하지 실행 중이거나 단위 테스트를 디버깅 할 때 Visual Studio 출력 창에 표시 (틀림없이이 버그).
  • Debug.Write-Visual Studio 테스트 하니스가이를 캡처하여 테스트 출력에 표시합니다. 않는 비주얼 스튜디오 디버깅 옵션이 직접 실행 창에 리디렉션 출력을 구성하지 않는 한, 단위 테스트를 디버깅 할 때 Visual Studio 출력 창에 표시됩니다. 디버깅하지 않고 테스트를 실행하면 출력 (또는 즉시) 창에 아무 것도 나타나지 않습니다. 기본적으로 디버그 빌드 (즉, DEBUG 상수가 정의 된 경우)에서만 사용 가능합니다.
  • Trace.Write-Visual Studio 테스트 하니스가이를 캡처하여 테스트 출력에 표시합니다. 않습니다 단위 테스트를 디버깅 할 때 (단순히 디버깅하지 않고 테스트를 실행하지 않는 경우)는 Visual Studio 출력 (또는 즉시) 창에 나타납니다. 기본적으로 디버그 및 릴리스 빌드 (즉, TRACE 상수가 정의 된 경우) 모두에서 사용할 수 있습니다.

Visual Studio 2013 Professional에서 확인되었습니다.


1
기본 제공 Microsoft 테스트 프레임 워크가 아닌 Visual Studio 용 NUnit 및 NUnit 테스트 어댑터 확장을 사용하는 경우 규칙이 약간 다릅니다.
yoyo

9

당신이 사용할 수있는

Trace.WriteLine() 

단위 테스트를 디버깅 할 때 출력 창에 쓸 수 있습니다.


5

Visual Studio 2017에서 "TestContext"는 테스트 탐색기에 출력 링크를 표시하지 않습니다. 그러나 Trace.Writeline ()은 출력 링크를 보여줍니다.


FYI, 그 Trace.WriteLine
TroySteven

4

우선 모든 단위 테스트는 의도적으로 상호 작용없이 완전히 실행되어야합니다.

그 점을 제외하고는 생각했던 가능성이 없다고 생각합니다.

현재 응용 프로그램이 GUI 응용 프로그램 인 경우에도 콘솔을 여는 AllocConsole P / Invoke로 해킹을 시도 할 수 있습니다. 그러면 Console수업은 이제 열린 콘솔에 게시됩니다.


1
흠 .. 내 주요 동기는 콘솔에 추가 데이터를 작성하여 더 자세한 내용을 보는 것입니다. 나중에 필요하지 않을 수도있는 임시 일이 될 것입니다.
pencilCake


2

IMHO 출력 메시지는 대부분의 경우 실패한 테스트 사례에만 해당됩니다. 아래 형식을 만들었으므로 직접 만들 수도 있습니다. 이것은 VS 테스트 탐색기 창 자체에 표시됩니다.

VS 테스트 탐색기 창 에서이 메시지를 던지는 방법은 무엇입니까? 이와 같은 샘플 코드가 작동합니다.

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 (성공, "DELETE RECORD FAILED"); 그러면 Delete 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 it's solutions' problems.");
    }

그런 다음 ... 시간별로 생성 된 AdHocConsole 디렉토리를여십시오. '인쇄 진술'을 추가 할 때 별개로 표시하십시오. 그렇지 않으면 저글링됩니다.


0

Mac 용 Visual Studio

다른 솔루션은 Mac 용 VS에서 작동하지 않았습니다.

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.WriteConsole.WriteLine이러한 상황에서 코드입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.