문제

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() 모든 생성자에서 정적 초기화 프로그램의 사용을 금지합니까?정말 힘든 일이군요!

누군가 이것에 대한 마술을 알고 있습니까?

도움이 되었습니까?

해결책 2

직장 동료가 나에게 다음과 같은 해결 방법을 제공했는데, 이는 작업을 수행합니다.

로깅이 필요한 모든 수업에서 다음과 같은 로거 초기화가 있었습니다.

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에 의해 이 정적 초기화 프로그램이 아주 일찍 호출되어야 합니다.

다음 단계는 해당 스레드를 안전하게 만드는 것입니다 :(

다른 팁

단일 초기화 지점의 경우 다음으로 표시된 클래스를 사용해야 합니다. [SetUpFixture] 표시된 속성 및 메소드 [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 달릴 것이다 ~ 후에 SetUp ~에서 TestsInitializer, 하지만 VeryComplexLogicTests 무작위 순서로 실행될 수 있습니다.

에 따르면 링크된 문서, 선언하면 SetUpFixture 네임스페이스 외부의 클래스인 경우 설정 및 해제는 전체 어셈블리에 적용됩니다.

지정된 네임스페이스에는 하나의 SetUpFixture만 생성되어야 합니다.네임스페이스 외부의 SetUpFixture는 전체 어셈블리에 대한 SetUp 및 TearDown을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top