我刚开始测试xUnit.net,但它似乎没有捕获任何输出(控制台、调试、跟踪),正如我所预期的那样。
这有可能吗?我在xUnit.net 1.8中使用了一个示例.NET 4.0类库。
发布于 2011-08-23 18:13:09
一般来说,依赖日志记录和测试是一条糟糕的道路。通过/失败应该是测试的结果。而且他们根本不应该到达有足够多的东西在进行的阶段,以至于有必要查看跟踪。
xunit.gui.exe显示控制台和跟踪输出,而xunit.console.exe不显示。如果它很重要,你可以通过建立适当的标准.NET配置项来连接一个重定向到一个文件的TraceListener (这是一个FileWriterTraceListener,如果你在谷歌上搜索它,你应该能够连接到它)。
更新:正如在his blog post中所讨论的,Damian Hickey有一个很好的替代方案--将日志连接到xUnit 2 ITestOutputHelper,如https://github.com/damianh/CapturingLogOutputWithXunit2AndParallelTests/blob/master/src/Lib.Tests/Tests.cs中所示
更新2:在某些情况下,可以使用如下所示的简单适配器添加日志记录并将其提供给ITestOutputHelper,而不涉及LogContext (对不起,我只有F#版本):
// Requirement: Make SUT depend on Serilog NuGet
// Requirement: Make Tests depend on Serilog.Sinks.Observable
type TestOutputAdapter(testOutput : Xunit.Abstractions.ITestOutputHelper) =
let formatter = Serilog.Formatting.Display.MessageTemplateTextFormatter(
"{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}", null);
let write logEvent =
use writer = new System.IO.StringWriter()
formatter.Format(logEvent, writer);
writer |> string |> testOutput.WriteLine
member __.Subscribe(source: IObservable<Serilog.Events.LogEvent>) =
source.Subscribe write
let createLogger hookObservers =
LoggerConfiguration()
.WriteTo.Observers(Action<_> hookObservers)
.CreateLogger()
let createTestOutputLogger (output: ITestOutputHelper) =
let adapter = TestOutputAdapter testOutputHelper
createLogger (adapter.Subscribe >> ignore)
type Tests(testOutputHelper) =
let log = createTestOutputLogger testOutputHelper
[<Fact>] let feedToSut () =
// TODO pass log to System Under Test either as a ctor arg or a method arg这种方法与使用日志上下文的不同之处在于,到全局上下文Serilog Logger的日志记录将不会被拾取。
发布于 2015-06-26 00:06:31
xUnit.net 2的情况发生了一些变化。我知道问题是关于早期版本的,但由于人们将在这里进行升级,我认为值得指出这一点。
为了在版本2的测试输出中看到某种类型的输出,您需要在测试类中获取对Xunit.Abstractions.ITestOutputHelper实例的依赖(通过构造函数参数),然后在此接口上使用WriteLine方法。例如:
public class MyTestSpec
{
private readonly ITestOutputHelper _testOutputHelper;
public MyTestSpec(ITestOutputHelper testOutputHelper)
{
_testOutputHelper = testOutputHelper;
}
[Fact]
public void MyFact()
{
_testOutputHelper.WriteLine("Hello world");
}
}您可以选择将日志记录框架连接到此接口,方法可能是注入一个将所有调用转发到ITestOutpuHelper的ILog实现。
我承认您在默认情况下不希望这样做,但出于诊断目的,它有时会非常有用。当你的测试只在一些基于云的构建和测试服务器上失败时,这一点尤其正确!
发布于 2017-11-28 18:34:16
如果您的Console.Write嵌入在某些您不想重构的类层次结构的深层,这会很有帮助:
public MyTestClass(ITestOutputHelper output)
{
var converter = new Converter(output);
Console.SetOut(converter);
}
private class Converter : TextWriter
{
ITestOutputHelper _output;
public Converter(ITestOutputHelper output)
{
_output = output;
}
public override Encoding Encoding
{
get { return Encoding.Whatever; }
}
public override void WriteLine(string message)
{
_output.WriteLine(message);
}
public override void WriteLine(string format, params object[] args)
{
_output.WriteLine(format, args);
}
public override void Write(char value)
{
throw new NotSupportedException("This text writer only supports WriteLine(string) and WriteLine(string, params object[]).");
}
}https://stackoverflow.com/questions/7138935
复制相似问题