Ho trovato una soluzione, vedere la mia risposta qui sotto. Qualcuno ha uno più elegante?Posso eseguire automaticamente i test JUnit una volta con tutte le registrazioni abilitate e una volta con tutte le registrazioni disabilitate?
Voglio fare questo per aumentare la copertura del codice e trovare bug sottili.
Assumere il seguente classe da testare:
public class Foo {
private final Logger logger = LoggerFactory.getLogger(Foo.class);
public void bar() {
String param=[..];
if(logger.isInfoEnabled()) logger.info("A message with parameter {}", param);
if(logger.isDebugEnabled()) {
// some complicated preparation for the debug message
logger.debug([the debug message]);
}
}
}
e la seguente prova di classe:
public class FooTest {
@Test
public void bar() {
Foo foo=new Foo();
foo.bar();
}
}
Uno strumento in codice di copertura come ad esempio Cobertura riferirà correttamente che solo alcuni dei rami condizionali sono stati controllati.
info e debug sono attivati o disattivati per il logger.
Oltre ad avere un aspetto negativo nel punteggio di copertura, questo rappresenta un rischio reale.
Cosa succede se c'è qualche effetto collaterale causato dal codice interno se (logger.isDebugEnabled())? Cosa succede se il tuo codice funziona solo se DEBUG è abilitato e fallisce miseramente se il livello di log è impostato su INFO? (Questo è effettivamente accaduto in uno dei nostri progetti: p)
Quindi la mia conclusione è che il codice che contiene le dichiarazioni logger dovrebbe sempre essere provato una volta con tutta la registrazione attivata e una volta con tutta la registrazione disabilitata ...
Is c'è un modo per fare qualcosa del genere con JUnit? So come abilitare o disabilitare globalmente tutte le mie registrazioni in Logback, quindi il problema è: come posso eseguire i test due volte, una volta con la registrazione abilitata, una volta con la registrazione disabilitata.
p.s. Sono a conoscenza di this question ma non penso che questo sia un duplicato. Sono meno preoccupato per i valori di copertura assoluti, ma per i bug sottili e difficili da trovare che possono essere contenuti in un if (logger.isDebugEnabled()).
Nota: non è consigliabile gestire i livelli di registro per un'applicazione tipica scrivendo la configurazione dall'applicazione. I framework di registrazione sono progettati per gestire questo esterno all'applicazione. –
Sono test unitari, non è un'applicazione. Inoltre, ci sono certamente casi in cui la configurazione a livello di loog cambiava, ad es. un'opzione di riga di comando '-v' di un'applicazione di console. – Huxi
È possibile configurare logback programmaticamente senza Joran. Avresti un codice più breve. Inoltre, se la configurazione fosse stata programmata, è possibile ripristinare la vecchia configurazione alla fine di ogni test. Holler su logback-dev se desideri vedere un codice di esempio. Altrimenti, lavoro molto bello! – Ceki