NUnit을 사용하여 가능한 한 빨리 log4Net을 초기화하십시오.
문제
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을 제공합니다.