2012-06-14 15 views
8

私のアプリからいくつかのアプリメッセージをログに記録してみてください。このような状況では、私はlog4netでnunitを動作させたいだけです。私はここにいくつかの例を見つけたhttp://www.ofconsulting.com/PublicPortal/ofc-tech-blog/92-configure-log4net-with-nunit.htmllog4netとnunitテスト、最も基本的な例

log4netのは、このようにApp.configファイルにconfuguredさ:

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

そして、私のテストコードでは、私のテストに合格しているが、何ものlog.txtファイル内に記述されていない

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

に従っています。私は間違って何をしていますか?
私はちょうどアプリケーションを終了するアプリケーションを入力するようなメッセージを格納するためにできるだけシンプルにしたいです。よろしく。

[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ファイルを使用したいが、それだけでクリーンなようだ:あなたはこのような何かをするため

+0

Log4Netは正常に動作しますか?私が尋ねる理由は、あなたがLog4Netをロードする必要があるかどうかを知りたがっていることです。 – Faraday

+0

また、クラス間でログをコピー/ペーストするときに毎回あなたのクラス名を保存するために: プライベート静的読み取り専用ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod()。DeclaringType); – Faraday

+0

どうすれば正常に動作するのですか?私のテストプロジェクトにlog4netのリファレンスを追加しました。残りのコードはここに掲載されています。テストやビルドprjのエラーメッセージは表示されません。 – panjo

答えて

5

私の最高の推測では次のようになります。ここでは例の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

問題は(Visual StudioでのReSharperから実行)NUnitのテストランナーが別のフォルダ(それはコピーに試験アセンブリシャドウ)、そのXMLからテストを実行していることです完全な設定パスを指定しないかぎり、設定は使用できません。あなたはその後、テスト出力のログ出力が表示されるはずです

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

あなたはもちろん、基本的な構成を使用してのように、コード内のログ設定を指定することができます。

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

は、私は長い間、私が知っているとNUnitのでlog4netのを使用して、私は、任意の設定ファイルを使ったことがない、あなただけで、次の行を追加する必要がありますテストクラスコンストラクタ

BasicConfigurator.Configure(); 

here is the full answerサンプルテストクラスを見たい場合

+0

ショートとパーフェクト! – ShloEmi

関連する問題