2

我想知道在 NUnit 项目中初始化 log4Net 的最佳方法是什么。当然,我想尽快调用初始化代码(即 . XmlConfigurator.Configure()),以获得尽可能多的早期日志输出。但是由于我的项目是通过 NUnit 运行的,所以我几乎无法控制它的入口点。

根据 NUnit 文档,它应该首先调用一些构造函数,然后调用一个用 标记[SetUp]的类中的属性标记的方法[TestFixtureSetup]

所以,首先,我创建了一个静态帮助类,我可以毫无问题地多次调用它。

  public static class LoggingFacility
  {
    private static bool _loggerIsUp = false;

    public static void InitLogger()
    {
      if (_loggerIsUp == false)
        XmlConfigurator.ConfigureAndWatch(f);

      _loggerIsUp = true;
    }
  }

然后,我将我所有的[TestFixtureSetup]继承都变成了一个,除了调用之外几乎什么都不做LoggingFacility.initLogger()。但这仍然留下了之前运行的所有构造函数,我只能假设随机的顺序。而且,它可能会在我能够执行一些代码之前进行一些静态初始化。

事实上,正如我在日志中看到的那样,执行的前 4 秒左右完全没有记录。

这是否意味着我必须InitLogger()在每个构造函数中调用 my 并禁止使用任何静态初始化程序?这是一项艰巨的工作!

有人知道这个魔术吗?

4

2 回答 2

4

对于单个初始化点,您应该使用标有[SetUpFixture]属性的类和标有 的方法[SetUp],例如:

[SetUpFixture]
public class TestsInitializer
{
    [SetUp]
    public void InitializeLogger()
    {
        LoggingFacility.InitLogger();
    }
}

现在,此方法 ( [SetUp] InitializeLogger) 将在任何测试运行之前运行,与标有 的方法相同,[TearDown]将在所有测试运行后运行。但这里有一个问题——在这种情况下, anyall是什么意思?来自与标有 的类在同一命名空间中声明的[SetUpFixture]类的测试。

例如,假设这样的层次结构:

- Tests
--- Business
----- TestsInitializer.cs // SetUpFixture class
----- FirstBusinessTests.cs
----- SecondBusinesTests.cs
--- ComplexLogic
----- VeryComplexLogicTests.cs

First并将from之后SecondBusinessTests运行,但可能以随机顺序运行。 SetUpTestsInitializerVeryComplexLogicTests

根据链接文档,如果您SetUpFixture在任何命名空间之外声明类,则设置和拆卸将适用于整个程序集:

在给定的命名空间中只能创建一个 SetUpFixture。任何命名空间之外的 SetUpFixture 为整个程序集提供 SetUp 和 TearDown。

于 2012-03-07T20:59:07.240 回答
1

一位工作伙伴为我提供了以下解决方法,可以完成这项工作:

在我所有需要记录的类中,我进行了以下记录器初始化

private static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

我只是将其更改为单例初始化程序

private static readonly ILog Log = LoggingFacility.GetLoggerWithInit(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

/*** ... ***/

public static class LoggingFacility
{
  private static bool _loggerIsUp = false;

  public static ILog GetLoggerWithInit(Type declaringType)
  {
    if (_loggerIsUp == false)
      XmlConfigurator.Configure(_log4NetCfgFile);
    _loggerIsUp = true;
    return LogManager.GetLogger(declaringType);
  }
}

因为我在每个类中都有这段代码,所以 NUnit 在实例化我的测试类时必须很早就调用这个静态初始化程序。

下一步是使该线程安全:(

于 2012-03-12T14:39:59.120 回答