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.