单元测试记录(或运行)多次

问题描述:

我有这个简单的测试:单元测试记录(或运行)多次

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单独运行相同的测试,则输出很好,不会重复。但是,如果我在同一班的其他测试中进行此测试,则输出会重复三次。

我完全困惑。这到底是怎么回事?

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