2
votes

Comment créer un nouveau fichier journal pour chaque exécution de tests dans pytest?

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


0 commentaires

3 Réponses :


4
votes

Remarque

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.

Réponse

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.


0 commentaires

3
votes

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


1 commentaires

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.



1
votes

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.


0 commentaires