2017-01-22 4 views
0

In pytest (3.04; Python 3.4) Ich versuche unter bestimmten Umständen die Ausgabe zu deaktivieren. Ich versuche dem Beispiel this doc page zu folgen. Allerdings kann ich Capsys nicht als Funcarg angeben. Als Follow-up möchte ich sowohl die Argumente funcarg als auch on-funcarg akzeptieren, so dass ich eine Klassenmethode verwenden kann, die ein oder mehrere normale Argumente annimmt. Wie kann ich das machen?In Pytest Wie deaktiviere ich Capture vorübergehend in einer Klassenmethode?

Idealerweise würde diese Klasse Methode funktioniert:

def always_print(self, message, capsys): 
     with capsys.disabled(): 
      print(message) 

Aber ich kann nicht einmal dies funktioniert:

def always_print(capsys): 
    with capsys.disabled(): 
     print('FIXME') 

Erhalten Sie den Fehler:

... 
>  always_print() 
E  TypeError: always_print() missing 1 required positional argument: 'capsys' 

Edit 1: Piotrs Antwort löste meine Spezifikation c Problem. Allerdings habe ich auch entdeckt, zwei wichtige Vorbehalte, die ich hatte in der Dokumentation oder anderen Beiträgen nicht abgeholt, so dass für andere Nutzen hier teilen

  1. es scheint, dass capsys.disabled() gilt nur für stdout und nicht stderr, wo ich ursprünglich meine Debug-Nachrichten per * nix Best Practice gesendet habe.
  2. Wenn Sie ein Datei-Handle auf sys.stdout vor aufrufen capsys.disabled(), dann wird dies aufgrund der magischen Datei-Deskriptor Mangling, die Pytest tut, nicht funktionieren.

So zum Beispiel, müssen Sie es auf diese Weise (zum Beispiel tun, wenn Ihr kwargs eine optionale „Datei“ Schlüsselwort enthalten, wie die integrierte Druck() gibt:

fhandle = kwargs.get('file', sys.stdout) #will not work! 
    with capsys.disabled(): 
     fhandle = kwargs.get('file', sys.stdout) #must be in context 
     print(message, file=fhandle) 

Antwort

1

Nun, capsys ist eine Build-in Befestigung für Tests. Sie sollten es als Test Argument bekommen, und es passieren weiter

def always_print(capsys): 
    with capsys.disabled(): 
     print('FIXME') 

def test_always_print(capsys): 
    always_print(capsys) 

es wird funktionieren, wenn Sie es mit pytest Befehl ausführen.

Edit:

Ausführlichkeit zu vermeiden, können Sie einige globale capsys Variable für alle Tests (basierend auf der Antwort how to share a variable across modules for all tests in py.test) vorbereiten:

# globals.py 
capsys = None 

# conftest.py 
import pytest 
import globals as gbl 
from _pytest.capture import capsys 

@pytest.fixture(autouse=True) 
def populate_globals(request): 
    gbl.capsys = capsys(request) 

# my_tests.py 
import globals as gbl 

def test_foo(): 
    with gbl.capsys.disabled(): 
     print('You can see me') 

def test_bar(): 
    with gbl.capsys.disabled(): 
     print('You can see me too') 
+0

ich sehe. Vielen Dank. Aber das bedeutet, dass ich die capsys funcarg zu jedem meiner Tests hinzufügen muss, um sie an die print_always-Methode zu übergeben. Ich würde das lieber nicht machen müssen, da es viel mehr Ausführlichkeit ist. Irgendwelche Vorschläge? – JJC

+1

@JJC Hallo Kumpel, ich habe die Antwort bearbeitet und die Lösung hinzugefügt, um zusätzliche Ausführlichkeit zu vermeiden. –

+1

Danke! Die Verwendung eines globalen Moduls ist vielleicht ein bisschen wie ein Klotz, aber es macht den Job fertig und vermeidet, dass viel Rauschen zu meinen Testfunktionen hinzugefügt wird. Ich habe zwei wichtige Vorbehalte entdeckt, als ich versuchte, dies zum Laufen zu bringen, was ich zuvor in der Dokumentation nicht erfahren hatte. Ich habe sie hinzugefügt. [Dzięki Piotrze! :)] – JJC

Verwandte Themen