C# 使用NUnit尽早初始化log4Net

C# 使用NUnit尽早初始化log4Net,c#,nunit,log4net,nunit-2.5,C#,Nunit,Log4net,Nunit 2.5,我想知道在NUnit项目中初始化log4Net的最佳方法是什么。当然,我想调用init代码ie.XmlConfigurator.Configure尽快获得尽可能多的早期日志输出。但由于我的项目是通过NUnit运行的,所以我对它的入口点几乎没有控制权 根据NUnit文档,它应该首先调用一些构造函数,然后在标记为[TestFixtureSetup]的类中调用标记为[SetUp]属性的方法 因此,首先,我创建了一个静态助手类,我可以多次调用它而不会遇到麻烦 public static class

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

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

因此,首先,我创建了一个静态助手类,我可以多次调用它而不会遇到麻烦

  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并禁止使用任何静态初始值设定项?这是一项艰苦的工作


有人知道这有什么魔术吗?

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

[SetUpFixture]
public class TestsInitializer
{
    [SetUp]
    public void InitializeLogger()
    {
        LoggingFacility.InitLogger();
    }
}
现在,此方法[SetUp]InitializeLogger将在运行任何测试之前运行,与标记为[TearDown]的方法相同,在运行所有测试后将运行该方法。但这里有一个问题——在这种情况下,任何和所有这些都意味着什么?测试来自与用[SetUpFixture]标记的类在同一命名空间中声明的类

例如,假设层次结构如下:

- Tests
--- Business
----- TestsInitializer.cs // SetUpFixture class
----- FirstBusinessTests.cs
----- SecondBusinesTests.cs
--- ComplexLogic
----- VeryComplexLogicTests.cs
First和SecondBusinessTests将在TestsInitializer的安装之后运行,但是每个ComplexLogicTests都可能以随机顺序运行

根据,如果在任何命名空间之外声明SetUpFixture类,则安装和拆卸将应用于整个程序集:

在给定命名空间中只应创建一个SetUpFixture。任何命名空间之外的SetUpFixture为整个程序集提供设置和拆卸


一位工作伙伴为我提供了以下解决方案:

在我所有需要日志记录的类中,我都有以下记录器初始化

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 wile必须很早调用这个静态初始值设定项来实例化我的测试类


下一步是使线程安全:

只是想知道在测试中使用log4net的目的是什么,记录测试进度/结果还是将记录器实例化为某些类的依赖项?@sll:我使用两个日志输出:第一个是测试输出比NUnit本身更详细一点,第二个我需要快速准备好的是调试测试应用程序感谢命名空间提示,非常感谢。尽管如此,我的问题是NUnit在对[SetUpFixture]:构造函数和静态初始值设定项感到疑惑之前运行了很多代码,我想记录这些代码too@PPC:以前运行的是哪种代码?你是说NUnit是初始化还是你的代码,比如测试类构造函数等等?我很确定SetUpFixture在将您的自定义代码连接到NUnit时就已经开始了。也许你可以按照自己的方式使用配置文件,但老实说,我以前从未见过有人做过这样的事情。是的,我指的是构造函数之类的。我的第一个日志条目在大约5秒的正常运行时间开始,我没有看到我的大多数构造函数在那里登录。