Naplóüzenetek érvényesítése a JUnit segítségével

1. Bemutatkozás

Ebben az oktatóanyagban megnézzük, hogyan a JUnit tesztelés során lefedhetjük a generált naplókat.

Használjuk a slf4j-api és a visszalépésvégrehajtás és létrehozni egy egyedi függelék, amelyet felhasználhatunk a napló érvényesítéséhez.

2. Maven-függőségek

Mielőtt elkezdenénk, tegyük hozzá a visszalépés függőség. Ahogy natív módon megvalósítja a slf4j-api, a Maven tranzitivitás automatikusan letölti és befecskendezi a projektbe:

 ch.qos.logback logback-classic. 1.2.3 

ÁllítsdJ teszteléskor nagyon hasznos funkciókat kínál, ezért adjuk hozzá a függőségét a projekthez is:

 org.assertj assertj-core 3.15.0 teszt 

3. Alapvető üzleti funkció

Most hozzunk létre egy objektumot, amely naplókat generál, amelyekre alapozhatjuk tesztjeinket.

A mi BusinessWorker objektum csak egy metódust tesz ki. Ez a módszer minden naplószinthez azonos tartalmú naplót generál. Bár ez a módszer a való világban nem annyira hasznos, tesztelési céljainkra jól szolgál:

nyilvános osztály BusinessWorker {private static Logger LOGGER = LoggerFactory.getLogger (BusinessWorker.class); public void generatorLogs (String msg) {LOGGER.trace (msg); LOGGER.debug (msg); LOGGER.info (msg); LOGGER.warn (üzenet); LOGGER.error (üzenet); }}

4. A naplók tesztelése

Naplókat szeretnénk generálni, ezért hozzunk létre egy logback.xml fájl a src / test / resources mappába. Tartsuk a lehető legegyszerűbben, és irányítsuk át az összes naplót a KONZOL appender:

     % d {HH: mm: ss.SSS} [% t]% -5level% logger {36} -% msg% n 

4.1. MemoryAppender

Most hozzunk létre egy egyedi alkalmazás, amely naplózza a memóriát. Jól kiterjeszti a ListAppender hogy visszalépés ajánlatok, és néhány hasznos módszerrel gazdagítjuk:

public class MemoryAppender kiterjeszti a ListAppender {public void reset () {this.list.clear (); } nyilvános logikai elem tartalmazza a (Karaktersorozat, Szint szint) {return this.list.stream () .anyMatch (esemény -> event.getMessage (). toString (). tartalmazza (karakterlánc) )); } public int countEventsForLogger (String loggerName) {return (int) this.list.stream () .filter (event -> event.getLoggerName (). tartalmaz (loggerName)) .count (); } public List search (String string) {return this.list.stream () .filter (event -> event.getMessage (). toString (). tartalmaz (stringet)) .collect (Collectors.toList ()); } public List search (String string, Level level) {return this.list.stream () .filter (event -> event.getMessage (). toString (). tartalmaz (karakterlánc) && event.getLevel (). egyenlő (szint )) .collect (Collectors.toList ()); } public int getSize () {return this.list.size (); } public list getLoggedEvents () {return Collections.unmodifiableList (this.list); }}

A MemoryAppender osztály kezeli a Lista amelyet automatikusan naplózási rendszer tölt be.

Számos módszert tár fel annak érdekében, hogy a tesztek széles skáláját lefedje:

  • Visszaállítás() - törli a listát
  • tartalmazza (msg, level) - visszatér igaz csak akkor, ha a lista tartalmaz egy ILoggingEvent megfelel a megadott tartalmi és súlyossági szintnek
  • countEventForLoggers (loggerName) - adja vissza a ILoggingEvent nevű naplózó generálta
  • keresés (msg) - adja vissza a Lista nak,-nek ILoggingEvent megfelel az adott tartalomnak
  • keresés (msg, szint) - adja vissza a Lista nak,-nek ILoggingEvent megfelel a megadott tartalmi és súlyossági szintnek
  • getSize () - adja vissza a ILoggingEvents
  • getLoggedEvents () - a módosíthatatlan nézetet adja vissza ILoggingEvent elemek

4.2. Egységteszt

Ezután hozzunk létre egy JUnit tesztet üzleti dolgozónk számára.

Nyilatkozni fogunk MemoryAppender mezőként, és programozottan beírja a naplórendszerbe. Ezután elindítjuk a hozzátartozót.

Tesztjeinkhez a szintet állítjuk be HIBÁK:

@A nyilvános érvénytelen beállítás előtt () {Logger logger = (Logger) LoggerFactory.getLogger (LOGGER_NAME); memoryAppender = új MemoryAppender (); memoryAppender.setContext ((LoggerContext) LoggerFactory.getILoggerFactory ()); logger.setLevel (Level.DEBUG); logger.addAppender (memoryAppender); memoryAppender.start (); }

Most létrehozhatunk egy egyszerű tesztet, ahol példákat mutatunk be BusinessWorker osztály és hívja a generállogok módszer. Ezután állításokat tehetünk az általa generált naplókról:

@Test public void test () {BusinessWorker worker = new BusinessWorker (); worker.generateLogs (MSG); assertThat (memoryAppender.countEventsForLogger (LOGGER_NAME)). isEqualTo (4); assertThat (memoryAppender.search (MSG, Level.INFO) .size ()). isEqualTo (1); assertThat (memoryAppender.contains (MSG, Level.TRACE)). isFalse (); }

Ez a teszt a MemoryAppender:

  • Négy napló keletkezett - súlyosságonként egy bejegyzésnek kell jelen lennie, a nyomszintet szűrve
  • Csak egy naplóbejegyzés a tartalommal üzenet szintű súlyosságával INFO
  • Nincs naplóbejegyzés tartalommal üzenet és súlyossága NYOM

Ha sok napló létrehozásakor tervezzük ennek az osztálynak ugyanazt a példányát használni ugyanazon tesztosztályon belül, akkor a memóriahasználat fel fog kúszni. Felhívhatjuk a MemoryAppender.clear () módszer minden teszt előtt a memória felszabadítására és elkerülésére OutOfMemoryException.

Ebben a példában a megőrzött naplók hatókörét a LOGGER_NAME csomagot, amelyet „com.baeldung.junit.log“. Az összes naplót potenciálisan megtarthatnánk LoggerFactory.getLogger (Logger.ROOT_LOGGER_NAME), de ezt lehetőség szerint kerülnünk kell, mivel sok memóriát emészthet fel.

5. Következtetés

Ezzel a bemutatóval bemutattuk hogyan fedjük le a naplótermelést az egység tesztjeinken.

Mint mindig, a kód megtalálható a GitHubon.