Pregunta

Me pregunto ¿cuál es la mejor manera de inicializar log4Net en un NUnit proyecto.Por supuesto que quiero llamar el código de inicialización (es decir. XmlConfigurator.Configure() tan pronto como puedo conseguir como muchos de los primeros de registro de salida como puedo.Pero desde que mi proyecto se ejecuta a través de NUnit, tengo poco control sobre su punto de entrada.

De acuerdo con NUnit la documentación, se debe llamar a algunos constructores en primer lugar, a continuación, un método marcado con el [SetUp] atributo en una clase marcada con [TestFixtureSetup].

Así, en Primer lugar, he creado un auxiliar estática de la clase a la que puedo llamar varias veces sin problemas.

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

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

      _loggerIsUp = true;
    }
  }

Entonces, hice todos mis [TestFixtureSetup] heredar una sola que hace bastante mucho nada más que llamar LoggingFacility.initLogger().Pero que deja a todos los constructores que se ejecutan antes, en un orden que sólo puede asumir de forma aleatoria.Y por otra parte, es probable que hacer algunas inicializaciones estáticas antes de que yo soy incluso capaz de ejecutar código.

De hecho, como puede ver en mi registro, los primeros 4 segundos de ejecución son completamente inéditos.

Qué significa que voy a tener que llamar a mi InitLogger() en cada constructor y prohibir el uso de cualquier inicializador estático?Eso es trabajo duro!

¿Alguien sabe un truco de magia con esto?

¿Fue útil?

Solución 2

Un compañero de trabajo me ha proporcionado la siguiente solución, que hace el trabajo:

En todas mis clases que requieren registro, tuve el siguiente registrador de inicialización

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

Simplemente me cambió a un singleton de inicializador

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);
  }
}

Porque tengo este código en cada clase, este inicializador estático tiene que ser llamado muy temprano por NUnit artimaña instancias de mis clases de prueba.

El próximo paso es hacer que el hilo seguro :(

Otros consejos

Para una sola de inicialización de punto que se debe utilizar la clase marcados con [SetUpFixture] atributo y método marcado con [SetUp], por ejemplo:

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

Ahora, este método ([SetUp] InitializeLogger ejecutará la antes de cualquier prueba se ejecuta, el mismo como uno marcado con [TearDown] se ejecutará una vez que todas las pruebas se ejecutan.Pero aquí está el truco - ¿qué cualquier y todos significa en este contexto?Pruebas de clases declarado en el mismo espacio de nombres como clase marcada con [SetUpFixture].

Por ejemplo, suponiendo que la jerarquía como este:

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

First y SecondBusinessTests se ejecutará después de SetUp de TestsInitializer, sin embargo , VeryComplexLogicTests se podría ejecutar en orden aleatorio.

De acuerdo a vinculado documentación, si se declara SetUpFixture clase fuera de cualquier espacio de nombres, la instalación y desmontaje se aplicará para toda la asamblea:

Sólo uno SetUpFixture debe ser creado en un determinado espacio de nombres.Un SetUpFixture fuera de cualquier espacio de nombres proporciona la Instalación y Desmontaje de toda la asamblea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top