はじめに
- 単体テストケースにて、log4netで出力したメッセージも確認項目に含めたいときのメモ
単体テストプロジェクト側でのログ出力設定
- テスト対象プロジェクト側にてlog4netでのログ出力の実装を行っていても、単体テスト側から処理を呼び出した場合、ログ出力は行われない
(なんでかはちゃんと調べてない) - 単体テスト用プロジェクトのApp.configに同じようにアペンダー設定をつっこむとログ出力されるようになる
- AppendToFileをfalseにすることでログ出力時、必ずローテーションを行うようにする(この方がテストしやすい)
App.config
<configSections>
<section name="log4net" type=" log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<appender name="SizeRollingLogToFile" type="log4net.Appender.RollingFileAppender">
<param name="File" value="ログファイル名"/>
<param name="staticLogFileName" value="true"/>
<param name="AppendToFile" value="false"/>
<param name="MaxSizeRollBackups" value="0"/>
<param name="RollingStyle" value="Size"/>
<param name="MaximumFileSize" value="1MB"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] [%-5p] %c %M - %m%n"/>
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="SizeRollingLogToFile"/>
</root>
</log4net>
単体テストでの確認
- 単体テスト内でログファイルをStreamReaderで読もうとすると、log4net側と競合しSystem.IO.IOExceptionとなる
- 仕方ないので別名ファイルにログを一時的にコピーし、そちらを読み込む
- ログファイルの先頭行に確認したいメッセージが存在する場合、以下のようなイメージでテストする
SampleTest.cs
[TestMethod]
public void TestMethod()
{
// テスト対象メソッドを実行
適当なクラス.適当なメソッド();
// メインのログファイルは読み込めないため、確認用に一時的にコピー
File.Copy("ログファイル", "一時的なログファイル", true);
// ログファイルの読込み
using (StreamReader file = new StreamReader("一時的なログファイル", Encoding.GetEncoding("shift_jis")))
{
// ファイルの先頭行を読み込み
string line = file.ReadLine();
// ログ内に適切な文言が存在するかどうか
Assert.IsTrue(line.Contains("出力されるべきメッセージ"));
}
}