En regardant le dernier cas de test JUnit que j'ai écrit, j'ai appelé la méthode BasicConfigurator.configure () de log4j dans le constructeur de classe. Cela a bien fonctionné pour exécuter uniquement cette classe unique à partir de la commande "exécuter comme cas de test JUnit" d'Eclipse. Mais je me rends compte que c'est incorrect: je suis presque sûr que notre suite de tests principale exécute toutes ces classes à partir d'un seul processus, et par conséquent, la configuration de log4j devrait se produire quelque part plus haut.
Mais j'ai encore besoin d'exécuter un cas de test par lui-même quelques fois, auquel cas je veux que log4j soit configuré. Où dois-je placer l'appel de configuration pour qu'il soit exécuté lorsque le scénario de test s'exécute de manière autonome, mais pas lorsque le scénario de test est exécuté dans le cadre d'une suite plus grande?
Réponses:
La
LogManager
classe détermine la configuration log4j à utiliser dans un bloc statique qui s'exécute lorsque la classe est chargée. Il existe trois options destinées aux utilisateurs finaux:log4j.defaultInitOverride
false, il ne configurera pas du tout log4j.Spécifiez manuellement le chemin d'accès au fichier de configuration et remplacez la recherche de chemin de classe. Vous pouvez spécifier l'emplacement du fichier de configuration directement en utilisant l'argument suivant pour
java
:-Dlog4j.configuration=<path to properties file>
dans la configuration de votre testeur.
Autorisez log4j à analyser le chemin d'accès aux classes pour un fichier de configuration log4j pendant votre test. (le défaut)
Voir également la documentation en ligne .
la source
-Dlog4j.configurationFile=log4j2.xml
. En outre, si vous essayez de déboguer le chargement / démarrage, ce paramètre peut être utile:-Dlog4j2.debug=true
.Je mets généralement juste un fichier log4j.xml dans src / test / resources et laisse log4j le trouver par lui-même: aucun code requis, l'initialisation log4j par défaut le récupérera. (Je veux généralement définir mes propres enregistreurs sur 'DEBUG' de toute façon)
la source
Vous voudrez peut-être vous pencher sur Simple Logging Facade pour Java (SLF4J) . C'est une façade qui s'enroule autour de Log4j qui ne nécessite pas un appel de configuration initial comme Log4j. Il est également assez facile de remplacer Log4j par Slf4j car les différences d'API sont minimes.
la source
J'utilise les propriétés système dans log4j.xml:
... <param name="File" value="${catalina.home}/logs/root.log"/> ...
et commencez les tests avec:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.16</version> <configuration> <systemProperties> <property> <name>catalina.home</name> <value>${project.build.directory}</value> </property> </systemProperties> </configuration> </plugin>
la source