【问题标题】:Unit tests logged (or run) multiple times多次记录(或运行)单元测试
【发布时间】:2010-06-15 05:24:22
【问题描述】:

我有一个简单的测试:

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 中再次(或更多)按 RUN,我会得到以下信息:

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

依此类推(如果我运行 5 次,我会得到 5 个重复行)。现在,如果我从 reSharper 单独运行相同的测试,则输出很好并且不会重复。但是,如果我将此测试与同一类中的其他 2 个测试一起运行,则输出会重复 3 次。

我完全糊涂了。这到底是怎么回事?

【问题讨论】:

    标签: c# nunit resharper log4net


    【解决方案1】:

    Log4net 在每次测试运行时都会重新初始化,并且每次都会添加附加程序。我怀疑 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();
        }
    }
    

    【讨论】:

    • 明天将尝试您的解决方案。我最终只是将new ConsoleAppender() 提供给Configure() 方法并且它起作用了。
    猜你喜欢
    • 2019-12-10
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多