Utvrđivanje poruka dnevnika pomoću JUnit-a

1. Uvod

U ovom ćemo uputstvu pogledati kako možemo pokriti generirane zapisnike u JUnit testiranju.

Koristit ćemo slf4j-api i prijavaprovedba i stvoriti prilagođeni dodatak koji možemo koristiti za utvrđivanje zapisnika.

2. Ovisnosti Mavena

Prije nego što započnemo, dodajmo prijava ovisnost. Kao što je izvorno provodi slf4j-api, automatski ga preuzima i ubrizgava u projekt Maven tranzitivnost:

 ch.qos. logback prijava-klasika. 1.2.3 

AssertJ nudi vrlo korisne funkcije prilikom testiranja, pa dodajmo i njegovu ovisnost o projektu:

 org.assertj assertj-core 3.15.0 test 

3. Osnovna poslovna funkcija

Ajmo sada stvoriti objekt koji će generirati zapisnike na kojima ćemo temeljiti svoje testove.

Naše BusinessWorker objekt će izložiti samo jednu metodu. Ova metoda generira zapisnik s istim sadržajem za svaku razinu zapisnika. Iako ova metoda nije toliko korisna u stvarnom svijetu, poslužit će nam u svrhe testiranja:

javna klasa BusinessWorker {private static Logger LOGGER = LoggerFactory.getLogger (BusinessWorker.class); javna praznina generira zapisnike (string msg) {LOGGER.trace (msg); LOGGER.debug (msg); LOGGER.info (msg); LOGGER.warn (msg); LOGGER.error (msg); }}

4. Testiranje dnevnika

Želimo generirati zapisnike, pa kreirajmo logback.xml datoteku u src / test / resources mapu. Neka bude što jednostavnije i preusmjerimo sve zapisnike u KONZOLA dodatak:

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

4.1. MemoryAppender

Ajmo sada stvoriti prilagođeni dodatak koji čuva zapisnike u memoriji. Dobro produžiti ListAppender da prijava ponude, a mi ćemo ga obogatiti s nekoliko korisnih metoda:

javna klasa MemoryAppender proširuje ListAppender {public void reset () {this.list.clear (); } public boolean sadrži (niz niza, razina razine) {return this.list.stream () .anyMatch (event -> event.getMessage (). toString (). contains (string) && event.getLevel (). jednako (razina )); } javni int countEventsForLogger (niz loggerName) {return (int) this.list.stream () .filter (event -> event.getLoggerName (). contains (loggerName)) .count (); } pretraživanje javnog popisa (string niza) {return this.list.stream () .filter (event -> event.getMessage (). toString (). contains (string)) .collect (Collectors.toList ()); } pretraživanje javnog popisa (niz niza, razina razine) {return this.list.stream () .filter (event -> event.getMessage (). toString (). contains (string) && event.getLevel (). jednako (razina )) .collect (Collectors.toList ()); } public int getSize () {return this.list.size (); } javni popis getLoggedEvents () {return Collections.unmodifiableList (this.list); }}

The MemoryAppender razred obrađuje a Popis koji se automatski popunjava sustavom bilježenja.

Izlaže razne metode kako bi se obuhvatio širok raspon svrha ispitivanja:

  • resetirati () - briše popis
  • sadrži (poruka, razina) - vraća se pravi samo ako popis sadrži znak ILoggingEvent podudaranje s navedenim sadržajem i razinom ozbiljnosti
  • countEventForLoggers (loggerName) - vraća broj ILoggingEvent generira imenovani zapisnik
  • traži (msg) - vraća a Popis od ILoggingEvent podudaranje određenog sadržaja
  • traži (poruka, razina) - vraća a Popis od ILoggingEvent podudaranje s navedenim sadržajem i razinom ozbiljnosti
  • getSize () - vraća broj ILoggingEvents
  • getLoggedEvents () - vraća nepromjenjiv pogled na ILoggingEvent elementi

4.2. Jedinstveni test

Dalje, kreirajmo JUnit test za našeg poslovnog radnika.

Proglasit ćemo svoje MemoryAppender kao polje i programski ga ubrizgajte u sustav dnevnika. Zatim ćemo pokrenuti dodavač.

Za naše testove postavit ćemo razinu na DEBUG:

@Prije javne void setup () {Logger logger = (Logger) LoggerFactory.getLogger (LOGGER_NAME); memoryAppender = novi MemoryAppender (); memoryAppender.setContext ((LoggerContext) LoggerFactory.getILoggerFactory ()); logger.setLevel (Level.DEBUG); logger.addAppender (memoryAppender); memoryAppender.start (); }

Sada možemo stvoriti jednostavan test u kojem instanciramo svoj BusinessWorker razredu i nazovite generatedLogs metoda. Tada na zapisnicima koje on generira možemo tvrditi:

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

Ovaj test koristi tri značajke MemoryAppender:

  • Generirana su četiri dnevnika - trebao bi biti prisutan jedan unos po težini, s filtriranom razinom traga
  • Samo jedan zapis sa sadržajem poruka s razinom ozbiljnosti INFO
  • Nema unosa u zapisnik sa sadržajem poruka i ozbiljnosti TRAG

Ako planiramo koristiti istu instancu ove klase unutar iste testne klase prilikom generiranja puno dnevnika, upotreba memorije će puzati. Možemo se pozvati na MemoryAppender.clear () prije svakog testa kako biste oslobodili memoriju i izbjegli OutOfMemoryException.

U ovom smo primjeru smanjili opseg zadržanih dnevnika na LOGGER_NAME paket, koji smo definirali kao „com.baeldung.junit.log“. Mogli bismo zadržati sve zapisnike s LoggerFactory.getLogger (Logger.ROOT_LOGGER_NAME), ali to bismo trebali izbjegavati kad god je to moguće jer može potrošiti puno memorije.

5. Zaključak

Ovim smo uputstvom demonstrirali kako obuhvatiti stvaranje dnevnika u našim jediničnim testovima.

Kao i uvijek, kod se može pronaći na GitHub-u.


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