J'ai créé un fichier pytest.ini
,
addopts = --resultlog=log.txt
Cela crée un fichier journal, mais j'aimerais créer un nouveau fichier journal chaque fois que j'exécute le tests.
Je suis nouveau dans le pytest, et pardonnez-moi si j'ai manqué quelque chose en lisant la documentation.
Merci
3 Réponses :
L'argument --result-log
est obsolète et doit être supprimé dans la version 6.0 (voir Abandons et suppressions: journal des résultats ). L'implémentation de remplacement possible est abordée dans le numéro 4488 , alors faites attention au prochain bosse de version majeure - le code ci-dessous cessera de fonctionner avec pytest==6.0
.
Vous pouvez modifier le resultlog
dans le pytest_configure
hookimpl . Exemple: mettez le code ci-dessous dans le fichier conftest.py
dans le répertoire racine de votre projet:
import datetime def pytest_configure(config): if not config.option.resultlog: timestamp = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d_%H-%M-%S') config.option.resultlog = 'log.' + timestamp
Maintenant si --result-log
n'est pas passé explicitement (vous devez donc supprimer addopts = --resultlog = log.txt
de votre pytest.ini
) , pytest
créera un fichier journal se terminant par un horodatage. Passer --result-log
avec un nom de fichier journal remplacera ce comportement.
Répondre à ma propre question.
Comme hoefling l'a mentionné, --result-log
est obsolète, j'ai dû trouver un moyen de le faire sans utiliser cet indicateur. Voici comment je l'ai fait,
conftest.py
import logging log = logging.getLogger(__name__) def test_my_code(): ****test code
pytest.ini
[pytest] log_cli = true log_cli_level = CRITICAL log_cli_format = %(message)s log_file_level = DEBUG log_file_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s) log_file_date_format=%Y-%m-%d %H:%M:%S
test_my_code.py p>
from datetime import datetime import logging log = logging.getLogger(__name__) def pytest_assertrepr_compare(op, left, right): """ This function will print log everytime the assert fails""" log.error('Comparing Foo instances: vals: %s != %s \n' % (left, right)) return ["Comparing Foo instances:", " vals: %s != %s" % (left, right)] def pytest_configure(config): """ Create a log file if log_file is not mentioned in *.ini file""" if not config.option.log_file: timestamp = datetime.strftime(datetime.now(), '%Y-%m-%d_%H-%M-%S') config.option.log_file = 'log.' + timestamp
Attention, la journalisation en direct n'est pas la même chose que le --result-log
. Le premier ne fait que conserver les journaux émis par votre code, le second écrit une copie de la sortie complète du test dans un fichier.
Vous pouvez avoir différents journaux d'exécution de pytest en nommant le fichier journal l'heure à laquelle l'exécution du test démarre.
pytest tests --log-file $(date '+%F_%H:%M:%S')
Cela créera un fichier journal pour chaque exécution de test. Et le nom de l'exécution du test serait l'horodatage.
$ (date '+% F_% H:% M:% S')
est la commande bash pour obtenir l'horodatage actuel en DATE_Hr: Min: Sec code> format.