[小技巧]自動化測試時NLog的訊息輸出到測試結果中

平常我會用Visual Stuido的測試專案,寫一些自動化測試,如單元測試、整合測試等等,受測的Code中有很多地方用NLog記錄訊息,在正試的環境,會寫到資料庫,但測試時我會想把訊息輸出到每一個測試的結果中,除了節省資料庫外,也比較容易追縱錯誤訊息。

平常我會用Visual Stuido的測試專案,寫一些自動化測試,如單元測試、整合測試等等,受測的Code中有很多地方用NLog記錄訊息,在正試的環境,會寫到資料庫,但測試時我會想把訊息輸出到每一個測試的結果中,除了節省資料庫外,也比較容易追縱錯誤訊息。

NLog設定檔

image 是.Net中很熱門的Log記錄,使用與設定都很簡單,這裡說明一下測試專案需要的設定檔,我的習慣是寫成獨立的檔案,不過也可以寫到web.config、app.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,會跳出偵錯對話框,使得自動化測試中斷。

 

image

圖一 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在測試時比較好用。

 

檔案屬性

檔案的屬性用設成如下

 image

圖二 檔案屬性

 

 

測試

寫個簡單的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();
}

 

image 

圖3 NLog輸出到測試結果