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.