2017-06-21 2 views
2

Ici, j'ai tests.py contenant:pytest flush stdout dans un fichier différent de la sortie de test

import sys 
sys.stdout = open('log2.log', 'w') 


class TestH5Client: 
    def test_something(self): 
     print("Start") 
     assert True 
     print("End") 

    def teardown_class(cls): 
     print("OK") 

Je cours mon test avec la commande shell suivante

pytest tests.py::TestH5Client::test_something >>log.log

et je veux que log.log pour contenir les informations du test et log2.log pour contenir tous les tirages, mais log2.log est vide

Contenu de log.log (le contenu est ce que je pense):

============================= test session starts ============================= 
platform win32 -- Python 3.6.0, pytest-3.1.0, py-1.4.33, pluggy-0.4.0 
rootdir: C:\Stefans\01.Learning_Python\27.pytest_std_ouput, inifile: 
collected 2 items 

tests.py . 

========================== 1 passed in 0.01 seconds =========================== 

Contenu de log2.log: le fichier est vide

Expectation pour log2.log contenu:

Start 
End 
OK 

Donc, mes questions sont ce que je fais mal et comment puis-je le faire fonctionner de cette façon, merci d'avance.

Répondre

1

Je suppose que l'option par défaut de py.test est de capturer al sortie en remplaçant sys.stdout, annulant votre code pour remplacer sys.stdout.

J'ai testé trois options qui semblent résoudre votre problème:

  1. Au lieu de sys.stdout primordial, vous pourriez remplacer la fonction d'impression, comme par exemple print = lambda x: open('log2.log', 'a').write(str(x)+"\n")
    • n'enregistrerez imprime récursive
    • permet par l'enregistrement de fichiers
  2. Vous pouvez désactiver la capture de sortie de py.test en ajoutant la -s option à votre commande d'exécution.
    • imprimera toutes les impressions dans tous vos tests, aussi récursive
    • impressions non convertis seront probablement votre nuage log.log -file
  3. Utilisez un cadre logger décent.

Malgré 3 étant le plus gros effort, en fonction de ce que vous voulez atteindre, je crois que c'est la meilleure solution.