2018-8-2 更新:今天發現在 git bash 中用 dotnet test 運行 xunit 測試可以正常輸出到控制台,只是在 PowerShell 與 Windows 命令行中有這個問題。
被這個問題困擾很久了,用 dotnet test 命令運行 xUnit.net 測試項目時,測試代碼中的 Console.WriteLine() 輸出的內容在控制台總是不顯示。
之前一直以為是 xunit runner 屏蔽了控制台的輸出,昨天在博問進行了提問 —— 請問 xUnit 在 .NET Core 中是如何屏蔽控制台輸出的,今天在 xUnit 的源代碼中苦苦搜尋, 心想只要知道是怎么屏蔽的,就有辦法解除。但是,翻遍 xUnit 源代碼也沒找到對 Console.Out 動手腳的地方。
后來,czd890 在博問中的回復 “啟動單獨的一個進程進行測試,所有輸出內容都在他的進程內” 讓我恍然大悟 —— xUnit 根本沒有屏蔽控制台輸出,只是因為 dotnet test 與 xunit runner 不在同一個進程,Console.WriteLine 在 xunit runner 進程中輸出的內容,在另外一個進程中當然看不到。
罪魁禍首就是 dotnet test 所使用的 xunit runner —— xunit.runner.visualstudio ,它會在另外一個進程中運行測試,而改用 dotnet xunit 命令就可以輕松解決這個問題。
在測試項目的 .csproj 文件中添加如下的配置
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
dotnet xunit 運行測試成功輸出"Hello World!"
PS > dotnet xunit Running .NET Core 2.1.0 tests for framework netcoreapp2.1... xUnit.net Console Runner (64-bit .NET Core 4.6.26515.07) Discovering: XUnitConsoleOutput Discovered: XUnitConsoleOutput Starting: XUnitConsoleOutput Hello World! Finished: XUnitConsoleOutput === TEST EXECUTION SUMMARY === XUnitConsoleOutput Total: 1, Errors: 0, Failed: 0, Skipped: 0, Time: 0.194s
