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

时间:2012-06-14 21:18:35

标签: c# tdd nunit log4net

我想尝试从我的应用中记录一些应用消息。在这种情况下,我只想强迫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>

我的测试代码正在关注

[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");
    }

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

4 个答案:

答案 0 :(得分:21)

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

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

log4net.Config.BasicConfigurator.Configure(
  new log4net.Appender.ConsoleAppender {
    Layout = new log4net.Layout.SimpleLayout()});

之后你应该在测试输出中看到日志输出。

答案 1 :(得分: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()
    {
        // ...
    }

我还使用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>

答案 2 :(得分:4)

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

BasicConfigurator.Configure();

here is the full answer如果你想看样本测试类

答案 3 :(得分:3)

您可以调整单元测试以检查文件本身(而不是手动检查)。注意存储在环境变量中的文件路径。这也适用于TeamCity测试运行器(无需硬编码路径)。

配置:

<log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="%env{ALLUSERSPROFILE}\test.log" />
    <appendToFile value="true" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="10MB" />
    <rollingStyle value="Size" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <root>
    <level value="INFO" />
    <appender-ref ref="RollingLogFileAppender" />
  </root>
</log4net>

代码:

private string _expectedFile;

[SetUp]
public void SetUp()
{
    _expectedFile = Path.Combine(
        Environment.GetEnvironmentVariable("ALLUSERSPROFILE"),
        "test.log");

    if (File.Exists(_expectedFile))
        File.Delete(_expectedFile);

    XmlConfigurator.Configure();
}

[Test] public void GivenLog4NetFileAppender_WhenLogInfoStringWithLog4Net_ThenWritesToDisk()
{
    ILog log = LogManager.GetLogger(typeof (LoggingIntegrationTests));
    log.Info("Message from test");

    LogManager.Shutdown();

    Assert.That(File.ReadAllText(_expectedFile),
                Is.StringContaining("Message from test"));
}