平常我會用Visual Stuido的測試專案,寫一些自動化測試,如單元測試、整合測試等等,受測的Code中有很多地方用NLog記錄訊息,在正試的環境,會寫到資料庫,但測試時我會想把訊息輸出到每一個測試的結果中,除了節省資料庫外,也比較容易追縱錯誤訊息。
NLog設定檔
是.Net中很熱門的Log記錄,使用與設定都很簡單,這裡說明一下測試專案需要的設定檔,我的習慣是寫成獨立的檔案,不過也可以寫到web.config、app.config中
NLog.Config <?xml version="1.0" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target name="debuglog" xsi:type="Console" layout="${date}: ${message}" /> </targets> <rules> <logger name="*" writeTo="debuglog" /> </rules> </nlog>
注意我的type是用Console,為什麼呢?
因為Visual Studio的測試支援將
- System.Console
- System.Diagnostics.Trace
- System.Diagnostics.Debug
這三個Class在測試時,所Write的訊息都會寫到測試結果中,而為什麼不用NLog的DebugTarget或Trace Target呢,因為NLog的
Debug是用StringBuilder記錄,不會輸出到測試結果中。
Trace會輸出到測試結果中,只是NLog訊息大於Error會引發Trace.Fail,會跳出偵錯對話框,使得自動化測試中斷。
圖一 Trace.Fail的偵錯話框
Note:
NLog的Targets有AspNet,AspResponse,Chainsaw,ColoredConsole,Console,Database,Debug,Debugger,EventLog,File,FormControl,LogReceiverService,Mail,Memory,MessageBox,MethodCall,MSMQ,Network,NLogViewer,Null,OutputDebugString,PerfCounter,RichTextBox,Trace,WebService等25種,測試過還是Console在測試時比較好用。
檔案屬性
檔案的屬性用設成如下
圖二 檔案屬性
測試
寫個簡單的Code來測測看結果吧
public class Sample { private static Logger logger = LogManager.GetCurrentClassLogger(); public void Foo() { logger.Trace("Start"); //================ logger.Trace("\tDo Something"); //================ logger.Trace("End"); } } [TestMethod] public void FooTest() { var sample = new Sample(); sample.Foo(); }
圖3 NLog輸出到測試結果