2017-12-11 2 views
1

Wie ich zu tun haben, etwas wie folgt aus:Wie benutze ich Fixtures und Capture des Stdout im Pytest gleichzeitig?

import pytest 
@pytest.mark.parametrize("test_input,expected", [ 
    ("3+5", 8), 
    ("2+4", 6), 
    ("6*9", 42), 
]) 
def test_printed_out_value(test_input, expected, capsys): # <-- notice the third argument 
    print test_input 
    out, err = capsys.readouterr() 
    assert out == expected 

Above Code schlägt fehl, da die globalen Befestigung capsys nicht verwendet werden können, wenn wir Parametrierung verwenden. Damit meine ich, ich kann keinen Weg finden, es innerhalb der Funktion zu übergeben. Ist es so, ich sehe nicht, wo ich capture the output aber immer noch parametrize verwenden kann?

Antwort

1

Ich bin nicht ganz sicher, ob ich Ihre Frage richtig verstanden, aber der folgende Code snipped Werke (2 Tests bestehen, 1 ausfällt):

import pytest 

class __capsys_class__: 
    def readouterr(self, in_str): 
     return eval(in_str), None 

@pytest.fixture(scope = 'module') 
def capsys(): 
    return __capsys_class__() 

@pytest.mark.parametrize('in_param', [ 
    ('3+5', 8), 
    ('2+4', 6), 
    ('6*9', 42), 
    ]) 
def test_printed_out_value(capsys, in_param): 
    test_input, expected = in_param 
    print(test_input) # Python 3 print function! 
    out, err = capsys.readouterr(test_input) 
    assert out == expected 

Zuerst lege ich Befestigungen am Anfang der Liste immer von Argumenten. Scheint so zu arbeiten. Zweitens, ich sende deine Tupel so wie sie sind (in_param) und entpacke sie innerhalb des Tests.

EDIT: stdout wird erfasst und angezeigt, wenn ein Test fehlschlägt. Für den obigen Code, sieht es wie folgt aus:

~> pytest 
========================================================== test session starts =========================================================== 
platform linux -- Python 3.6.2, pytest-3.3.1, py-1.5.2, pluggy-0.6.0 
rootdir: /home/ernst/Desktop/so/tests, inifile: 
collected 3 items                               

test_demo.py ..F                             [100%] 

================================================================ FAILURES ================================================================ 
___________________________________________________ test_printed_out_value[in_param2] ____________________________________________________ 

capsys = <test_demo.__capsys_class__ object at 0x7fd57e60c860>, in_param = ('6*9', 42) 

    @pytest.mark.parametrize('in_param', [ 
     ('3+5', 8), 
     ('2+4', 6), 
     ('6*9', 42), 
     ]) 
    def test_printed_out_value(capsys, in_param): 
     test_input, expected = in_param 
     print(test_input) 
     out, err = capsys.readouterr(test_input) 
>  assert out == expected 
E assert 54 == 42 

test_demo.py:21: AssertionError 
---------------------------------------------------------- Captured stdout call ---------------------------------------------------------- 
6*9 
=================================================== 1 failed, 2 passed in 0.03 seconds =================================================== 

Überprüfen Sie die 6*9 in der zweiten bis letzten Zeile. Dies wurde von der Druckfunktion im Test gedruckt.

Verwandte Themen