2012-06-14 5 views
8

Voglio provare a registrare alcuni messaggi app dalla mia app. In questa situazione voglio solo forzare nunit a lavorare con log4net. Ho trovato qualche esempio qui http://www.ofconsulting.com/PublicPortal/ofc-tech-blog/92-configure-log4net-with-nunit.html.test log4net e nunit, esempio più semplice

log4net è confugured in app.config come questo:

<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> 

E nel mio codice di prova sta seguendo

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

Il mio test è superato, ma nulla è scritto all'interno del file log.txt . Che cosa sto facendo di sbagliato?
Voglio solo rendere il più semplice possibile per archiviare messaggi come entrare in un'applicazione, uscire dall'applicazione. Saluti.

+0

Log4Net funziona normalmente? La ragione per cui lo chiedo è che voglio sapere se è necessario passare attraverso il caricamento di Log4Net ... – Faraday

+0

Inoltre, per salvare si digita il nostro nome della classe ogni volta che lo uso per copiare/incollare il mio registro tra le classi: private static readonly ILog Logger = LogManager.GetLogger (MethodBase.GetCurrentMethod(). DeclaringType); – Faraday

+0

come intendi funziona normalmente? :) Ho aggiunto il riferimento a log4net al mio progetto di test e il resto del codice è pubblicato qui, nessun messaggio di errore dato in esecuzione test o costruzione prj. – panjo

risposta

5

La mia ipotesi migliore sarebbe per voi di fare qualcosa di simile:

[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() 
    { 
     // ... 
    } 

Mi piacerebbe anche utilizzare il file Log4Net.config piuttosto che il file app.config, sembra proprio più pulito. Ecco un esempio di file 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> 
18

Il problema è che il test corridore NUnit (quando eseguito da ReSharper in Visual Studio) viene eseguito il test da un'altra cartella (è copie shadow il montaggio di prova), in modo che il xml la configurazione non è disponibile in quel punto a meno che non si specifichi il percorso completo di configurazione.

Si potrebbe utilizzare, naturalmente, la configurazione di base e specificare la configurazione di registrazione nel codice, come:

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

Si dovrebbe vedere l'uscita di registro nella uscita di test dopo.

3

È possibile regolare il test dell'unità per verificare il file stesso (anziché l'ispezione manuale). Si noti il ​​percorso del file memorizzato nelle variabili di ambiente. Funziona anche su corridori test di TeamCity (non è necessario codificare un percorso).

Config:

<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> 

Codice:

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

io fino a quando so e usato log4net con NUnit, ho mai usato alcun file di configurazione, basta aggiungere la seguente linea nel costruttore classe test

BasicConfigurator.Configure(); 

here is the full answer se si desidera vedere la classe di prova campione

+0

Breve e perfetto! – ShloEmi