log4net和nunit测试,最基本的例子

pan*_*njo 9 c# tdd log4net nunit

我想尝试从我的应用程序中记录一些应用程序消息.在这种情况下,我只想强迫nunit使用log4net.我在http://www.ofconsulting.com/PublicPortal/ofc-tech-blog/92-configure-log4net-with-nunit.html找到了一些例子.

log4net在app.config中配置如下:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>

<log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="LogFileAppender" />
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" value="log.txt" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
      </layout>
    </appender>
  </log4net>
Run Code Online (Sandbox Code Playgroud)

在我的测试代码中是如下

[TestFixture]
class DomainTests
{
    protected static readonly ILog log = LogManager.GetLogger(typeof(DomainTests));
    public void LoggingTests()
    {            
        log4net.Config.XmlConfigurator.Configure(); 
    }

    [Test]
    public void BasicLogTest()
    {
        log.Error("write my log entry already");
    }
Run Code Online (Sandbox Code Playgroud)

我的测试已通过,但log.txt文件中没有写入任何内容.我究竟做错了什么?
我只想尽可能简单地存储消息,如输入应用程序,退出应用程序.问候.

m0s*_*0sa 21

问题是NUnit测试运行器(当从visual studio中的resharper运行时)从另一个文件夹运行测试(它影子复制测试程序集),因此除非您指定完整的配置路径,否则此时xml配置不可用.

您当然可以使用基本配置并在代码中指定日志记录配置,例如:

log4net.Config.BasicConfigurator.Configure(
  new log4net.Appender.ConsoleAppender {
    Layout = new log4net.Layout.SimpleLayout()});
Run Code Online (Sandbox Code Playgroud)

之后您应该在测试输出中看到日志输出.


Mub*_*har 6

只要我知道并使用带有 nunit 的 log4net,我从未使用过任何配置文件,您只需要在测试类构造函数中添加以下行

BasicConfigurator.Configure();
Run Code Online (Sandbox Code Playgroud)

如果您想查看示例测试类,这里是完整的答案


Far*_*day 5

我最好的猜测是你做这样的事情:

[TestFixture]
class DomainTests
{
    protected static readonly ILog log = LogManager.GetLogger(typeof(DomainTests));
    public void LoggingTests()
    {            
        log4net.Config.XmlConfigurator.Configure(); 
    }

    [Test]
    public void BasicLogTest()
    {
        log.Error("write my log entry already");
    }

    [SetUp]
    RunBeforeAnyTests()
    {
        BasicConfigurator.Configure();
    }

    [TearDown]
    RunAfterAnyTests()
    {
        // ...
    }
Run Code Online (Sandbox Code Playgroud)

我也使用Log4Net.config文件而不是app.config文件,它看起来更干净.这是log4net.config文件的示例:

<log4net>
  <!-- A1 is set to be a LogFileAppender -->
  <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender, log4net" >
    <param name="File" value="C:\logging\log.txt" />
    <file value="c:\logging\Main" />
    <appendToFile value="true" />
    <datePattern value="yyyyMMdd'.log'" />
    <rollingStyle value="Composite" />
    <staticLogFileName value="false" />
    <maxSizeRollBackups value="-1" />
    <maximumFileSize value="500MB" />

    <!-- A1 uses PatternLayout -->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <!-- Set root logger level to DEBUG and its only appender to LogFileAppender -->
  <root>
    <!--<level value="OFF" />-->
    <!--<level value="FATAL" />-->
    <!--<level value="ERROR" />-->
    <!--<level value="WARN" />-->
    <!--<level value="INFO" />-->
    <level value="DEBUG" />
    <!--<level value="ALL" />-->
    <appender-ref ref="LogFileAppender" />
  </root>
</log4net>
Run Code Online (Sandbox Code Playgroud)