2010-06-15 49 views
9

我有這個簡單的測試:單元測試記錄(或運行)多次

protected readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().ReflectedType); 
private static int count = 0; 
[Test] 
public void TestConfiguredSuccessfully() 
{ 
    logger.Debug("in test method" + count++); 
} 

log4net的設置是這樣的:

[TestFixtureSetUp] 
public void SetUp() 
{ 
    log4net.Config.BasicConfigurator.Configure(); 
} 

的問題是,如果我運行這個測試中NUnit的一次,我得到的輸出(如預期):

1742 [TestRunnerThread] DEBUG Tests.TestSomthing (null) - in test method0 

但是,如果我在nUnit.exe按再次運行(或更多)我得到以下幾點:

1742 [TestRunnerThread] DEBUG Tests.TestSomthing (null) - in test method1 
1742 [TestRunnerThread] DEBUG Tests.TestSomthing (null) - in test method1 

等等(如果我運行它5次,我會得到5個重複行)。現在,如果我從reSharper單獨運行相同的測試,則輸出很好,不會重複。但是,如果我在同一班的其他測試中進行此測試,則輸出會重複三次。

我完全困惑。這到底是怎麼回事?

回答

7

Log4net正在每次測試運行時重新初始化,並且每次都添加appender(s)。我懷疑ReSharper沒有表現出行爲,因爲它每次都會啓動一個新進程(ReSharper測試運行器),而NUnit GUI不會。

我在過去曾經有過不同的風格,但是現在我已經使用了一個「SetupFixture」來初始化log4net(等等)。

[SetUpFixture] 
public class UnitTestSuiteSetupTeardown 
{ 
    [SetUp] 
    public void Setup() 
    { 
     log4net.Config.BasicConfigurator.Configure(); 
    } 

    [TearDown] 
    public void Teardown() 
    { 
     //Teardown stuff... 
    } 
} 

爲每個測試程序集添加一個,並確保該類沒有名稱空間。它將在您的所有測試中運行一次,即組件中的所有測試。我個人在解決方案級別擁有其中的一個,然後將其添加爲每個測試項目的鏈接。

更新

上面的例子如下的問題,並設置了基本配置。在我的實際SetUpFixture中,我從log4net配置文件(我再次在解決方案級別存儲,然後添加爲所有測試項目的鏈接)初始化log4net,例如,

[SetUpFixture] 
public class UnitTestSuiteSetupTeardown 
{ 
    [SetUp] 
    public void Setup() 
    { 
     LogFactory.Configure(); 
    } 

    [TearDown] 
    public void Teardown() 
    { 
     //Teardown stuff... 
    } 
} 

還有一個示例LogFactory類型的類。

public static class LogFactory 
{ 
    public const string DefaultConfigFileName = "log4net.config"; 

    static ILog GetLogger(Type callingType) 
    { 
     return new Log4NetLogger(LogManager.GetLogger(callingType)); 
    } 

    public static void Configure() 
    { 
     Type type = typeof(LogFactory); 
     FileInfo assemblyDirectory = AssemblyInfo.GetCodeBaseDirectory(type); 
     FileInfo configFile = new FileInfo(Path.Combine(assemblyDirectory.FullName, 
      DefaultConfigFileName)); 
     XmlConfigurator.ConfigureAndWatch(configFile); 
     log4net.ILog log = LogManager.GetLogger(type); 
     log.ToString(); 
    } 
} 
+0

明天試試你的解決方案。我最終只是向'Configure()'方法提供'新的ConsoleAppender()'並且它工作。 – 2010-06-15 10:01:58