unitarias tutorial pruebas español descargar nhibernate caching count log4net nhprof

nhibernate - tutorial - pruebas unitarias java netbeans



Contar el número de consultas ejecutadas por NHibernate en una prueba unitaria (1)

Hay otra forma (más simple, IMO) de afirmar si se está accionando la caché o si las consultas se están ejecutando: usando Estadísticas.

En primer lugar, debes habilitar las estadísticas en tu archivo de configuración de NH:

<property name="generate_statistics">true</property>

Después de eso, puede preguntar a la fábrica de su sesión cuando quiera cómo van las cosas. Ha hablado sobre la prueba de caché L2, por lo que podría tener algo como eso:

// act MappedEntity retrievedEntity = session.FindById(entity.Id); long preCacheCount = sessionFactory.Statistics.SecondLevelCacheHitCount; retrievedEntity = session.FindById(entity.Id); long postCacheCount = sessionFactory.Statistics.SecondLevelCacheHitCount; // assert Assert.AreEqual(preCacheCount + 1, postCacheCount);

Pero, si lo que realmente desea es el recuento de consultas, hay muchas otras opciones en la interfaz de Estadísticas:

sessionFactory.Statistics.QueryExecutionCount; sessionFactory.Statistics.TransactionCount;

Bueno, eso es todo. Espero que esto te ayude como me ayudó.

Saludos,

Filipe

En algunas pruebas de unidad / integración del código, deseamos verificar que nuestro código utilice el uso correcto de la memoria caché de segundo nivel.

Según el código presentado por Ayende aquí:

http://ayende.com/Blog/archive/2006/09/07/MeasuringNHibernatesQueriesPerPage.aspx

Escribí una clase simple para hacer justamente eso:

public class QueryCounter : IDisposable { CountToContextItemsAppender _appender; public int QueryCount { get { return _appender.Count; } } public void Dispose() { var logger = (Logger) LogManager.GetLogger("NHibernate.SQL").Logger; logger.RemoveAppender(_appender); } public static QueryCounter Start() { var logger = (Logger) LogManager.GetLogger("NHibernate.SQL").Logger; lock (logger) { foreach (IAppender existingAppender in logger.Appenders) { if (existingAppender is CountToContextItemsAppender) { var countAppender = (CountToContextItemsAppender) existingAppender; countAppender.Reset(); return new QueryCounter {_appender = (CountToContextItemsAppender) existingAppender}; } } var newAppender = new CountToContextItemsAppender(); logger.AddAppender(newAppender); logger.Level = Level.Debug; logger.Additivity = false; return new QueryCounter {_appender = newAppender}; } } public class CountToContextItemsAppender : IAppender { int _count; public int Count { get { return _count; } } public void Close() { } public void DoAppend(LoggingEvent loggingEvent) { if (string.Empty.Equals(loggingEvent.MessageObject)) return; _count++; } public string Name { get; set; } public void Reset() { _count = 0; } } }

Con el uso previsto:

using (var counter = QueryCounter.Start()) { // ... do something Assert.Equal(1, counter.QueryCount); // check the query count matches our expectations }

Pero siempre devuelve 0 para el recuento de consultas. No se registran sentencias sql.

Sin embargo, si hago uso de Nhibernate Profiler e invoco esto en mi caso de prueba:

NHibernateProfiler.Intialize()

Cuando NHProf utiliza un enfoque similar para capturar la salida de registro de NHibernate para el análisis a través de log4net, etc., mi QueryCounter comienza a funcionar.

Parece que me falta algo en mi código para que log4net esté configurado correctamente para el registro de nhibernate sql ... ¿alguien tiene alguna sugerencia sobre qué más debo hacer para obtener la salida de registro sql de Nhibernate?

Información adicional:

Logging.config:

<log4net> <appender name="trace" type="log4net.Appender.TraceAppender, log4net"> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &amp;lt;%P{user}&amp;gt; - %m%n" /> </layout> </appender> <appender name="console" type="log4net.Appender.ConsoleAppender, log4net"> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &amp;lt;%P{user}&amp;gt; - %m%n" /> </layout> </appender> <appender name="debug" type="log4net.Appender.DebugAppender, log4net"> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &amp;lt;%P{user}&amp;gt; - %m%n" /> </layout> </appender> <logger name="NHibernate.SQL" additivity="false"> <level value="DEBUG" /> <appender-ref ref="ConsoleAppender" /> </logger> <root> <priority value="DEBUG" /> <appender-ref ref="trace" /> <appender-ref ref="console" /> <appender-ref ref="debug" /> </root> </log4net>

show_sql: true

Basado en la respuesta de jfneis, escribí una clase mucho más simple que solo usa las estadísticas de fábrica de NHibernate:

public class QueryCounter { long _startCount; QueryCounter() { } public int QueryCount { get { return (int) (UnitOfWork.CurrentSession.SessionFactory.Statistics.QueryExecutionCount - _startCount); } } public static QueryCounter Start() { return new QueryCounter {_startCount = UnitOfWork.CurrentSession.SessionFactory.Statistics.QueryExecutionCount}; } }

Lo cual funciona bien una vez que las estadísticas están habilitadas.