Ukladanie správ protokolu s JUnit

1. Úvod

V tejto príručke sa pozrieme na to, ako na to môžeme pokryť vygenerované protokoly v testovaní JUnit.

Použijeme slf4j-api a logbackimplementácia a tvor vlastný doplnok, ktorý môžeme použiť na uplatnenie protokolu.

2. Maven závislosti

Než začneme, pridajme logback závislosť. Pretože natívne implementuje slf4j-api, je automaticky stiahnutý a vložený do projektu Mavenovou tranzitivitou:

 ch.qos.logback logback-classic. 1.2.3 

TvrdiťJ ponúka veľmi užitočné funkcie pri testovaní, pridajme teda do projektu aj jeho závislosť:

 org.assertj assertj-core 3.15.0 test 

3. Základná obchodná funkcia

Poďme teraz vytvoriť objekt, ktorý bude generovať protokoly, na ktorých môžeme založiť naše testy.

Náš BusinessWorker objekt vystaví iba jednu metódu. Táto metóda vygeneruje protokol s rovnakým obsahom pre každú úroveň protokolu. Aj keď táto metóda nie je v reálnom svete až taká užitočná, bude slúžiť dobre na účely testovania:

verejná trieda BusinessWorker {private static Logger LOGGER = LoggerFactory.getLogger (BusinessWorker.class); public void generateLogs (reťazcová správa) {LOGGER.trace (správa); LOGGER.debug (správa); LOGGER.info (správa); LOGGER.warn (správa); LOGGER.error (msg); }}

4. Testovanie protokolov

Chceme generovať protokoly, vytvorme preto logback.xml súbor v src / test / zdroje priečinok. Snažme sa to čo najjednoduchšie a presmerujme všetky protokoly na a KONSOLA prihlasovateľ:

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

4.1. MemoryAppender

Teraz vytvorme a vlastný appender, ktorý uchováva protokoly v pamäti. Budeme predĺžiť ListAppender že logback ponuky, a obohatíme ju o niekoľko užitočných metód:

verejná trieda MemoryAppender rozširuje ListAppender {public void reset () {this.list.clear (); } public boolean contains (String string, Level level) {return this.list.stream () .anyMatch (event -> event.getMessage (). toString (). contains (string) && event.getLevel (). equals (level )); } public int countEventsForLogger (String loggerName) {return (int) this.list.stream () .filter (event -> event.getLoggerName (). contains (loggerName)) .count (); } verejné vyhľadávanie v zozname (reťazec reťazcov) {návrat this.list.stream () .filter (udalosť -> event.getMessage (). toString (). obsahuje (reťazec)) .collect (Collectors.toList ()); } vyhľadávanie vo verejnom zozname (reťazec reťazcov, úroveň úrovne) {návrat this.list.stream () .filter (udalosť -> udalosť.getMessage (). toString (). obsahuje (reťazec) && event.getLevel (). equals (úroveň )) .collect (Collectors.toList ()); } public int getSize () {return this.list.size (); } public List getLoggedEvents () {return Collections.unmodifiableList (this.list); }}

The MemoryAppender trieda kľučky a Zoznam ktorý sa automaticky zaplní protokolovým systémom.

Vystavuje rôzne metódy s cieľom pokryť širokú škálu testovacích účelov:

  • reset () - vymaže zoznam
  • obsahuje (správa, úroveň) - vracia sa pravda iba ak zoznam obsahuje ILoggingEvent zodpovedajúci zadanému obsahu a úrovni závažnosti
  • countEventForLoggers (loggerName) - vráti počet ILoggingEvent generované pomenovaným záznamníkom
  • hľadať (správa) - vráti a Zoznam z ILoggingEvent zodpovedajúci konkrétnemu obsahu
  • hľadať (správa, úroveň) - vráti a Zoznam z ILoggingEvent zodpovedajúci zadanému obsahu a úrovni závažnosti
  • getSize () - vráti počet ILoggingEvents
  • getLoggedEvents () - vráti neupraviteľný pohľad na ILoggingEvent prvkov

4.2. Test jednotky

Ďalej vytvoríme test JUnit pre nášho obchodného pracovníka.

Vyhlásime svoje MemoryAppender ako pole a programovo ho vložiť do logovacieho systému. Potom začneme prílohu.

Pre naše testy nastavíme úroveň na DEBUG:

@ Pred verejným nastavením neplatnosti () {Logger logger = (Logger) LoggerFactory.getLogger (LOGGER_NAME); memoryAppender = nový MemoryAppender (); memoryAppender.setContext ((LoggerContext) LoggerFactory.getILoggerFactory ()); logger.setLevel (Level.DEBUG); logger.addAppender (memoryAppender); memoryAppender.start (); }

Teraz môžeme vytvoriť jednoduchý test, v ktorom vytvoríme inštanciu nášho BusinessWorker triedy a zavolajte na generateLogs metóda. Potom môžeme urobiť tvrdenia o protokoloch, ktoré generuje:

@Test test verejnej neplatnosti () {BusinessWorker pracovník = nový 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 (); }

Tento test využíva tri vlastnosti MemoryAppender:

  • Boli vygenerované štyri protokoly - pre každú závažnosť by mal byť k dispozícii jeden záznam s filtrovanou úrovňou sledovania
  • Iba jedna položka protokolu s obsahom správa s úrovňou závažnosti INFO
  • Obsah neobsahuje žiadny záznam správa a závažnosť TRACE

Ak plánujeme pri generovaní veľkého množstva protokolov použiť tú istú inštanciu tejto triedy vo vnútri tej istej testovacej triedy, využitie pamäte sa bude plaziť. Môžeme vyvolať MemoryAppender.clear () metóda pred každým testom uvoľniť pamäť a vyhnúť sa OutOfMemoryException.

V tomto príklade sme zmenšili rozsah ponechaných protokolov na LOGGER_NAME balíček, ktorý sme definovali ako „com.baeldung.junit.log„. Potenciálne by sme si mohli ponechať všetky protokoly s LoggerFactory.getLogger (Logger.ROOT_LOGGER_NAME), Mali by sme sa tomu však vyhnúť, kedykoľvek je to možné, pretože to môže vyžadovať veľa pamäte.

5. Záver

Pomocou tohto tutoriálu sme demonštrovali ako pokryť generovanie protokolu v našich jednotkových testoch.

Ako vždy, kód nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found