2016-04-20 10 views
9

Ich suche nach einer Möglichkeit, alle meine Komponententests in PyTest auszuführen, selbst wenn einige von ihnen fehlschlagen. Ich weiß, dass es einen einfachen Weg dafür geben muss. Ich habe die CLi-Optionen überprüft und auf dieser Site nach ähnlichen Fragen/Antworten gesucht, aber nichts gesehen. Es tut uns leid, wenn dies bereits beantwortet wurde.Wie werden alle PyTest-Tests ausgeführt, selbst wenn einige fehlschlagen?

Betrachten wir zum Beispiel den folgenden Code-Schnipsel, mit PyTest Code daneben:

def parrot(i): 
    return i 

def test_parrot(): 
    assert parrot(0) == 0 
    assert parrot(1) == 1 
    assert parrot(2) == 1 
    assert parrot(2) == 2 

Standardmäßig stoppt die Ausführung bei der ersten Ausfall:

$ python -m pytest fail_me.py 
=================== test session starts =================== 
platform linux2 -- Python 2.7.10, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 
rootdir: /home/npsrt/Documents/repo/codewars, inifile: 
collected 1 items 

fail_me.py F 

=================== FAILURES =================== 
___________________ test_parrot ___________________ 

    def test_parrot(): 
     assert parrot(0) == 0 
     assert parrot(1) == 1 
>  assert parrot(2) == 1 
E  assert 2 == 1 
E  + where 2 = parrot(2) 

fail_me.py:7: AssertionError 
=================== 1 failed in 0.05 seconds =================== 

Was ich möchte Das Ausführen des Codes wird auch dann fortgesetzt, wenn PyTest den ersten Fehler erkennt.

+0

Siehe auch [diese Frage] (https://stackoverflow.com/q/4732827/102441) für "unittest", was mit einer Reihe von sehr ähnlichen Fragen verbunden ist – Eric

Antwort

9

Es hat alle Ihre Tests ausgeführt. Sie haben nur einen Test geschrieben und dieser Test lief!

Wenn Sie nicht-tödliche Behauptungen möchten, bei denen ein Test fortgesetzt wird, wenn eine Assertion fehlschlägt (wie die EXPECT-Makros von Google Test), versuchen Sie pytest-expect, die diese Funktionalität bietet. Hier ist das Beispiel ihrer Website gibt:

def test_func(expect): 
    expect('a' == 'b') 
    expect(1 != 1) 
    a = 1 
    b = 2 
    expect(a == b, 'a:%s b:%s' % (a,b)) 

Sie, dass Erwartung Ausfälle sehen den Test nicht stoppen, und alle die Erwartungen nicht gemeldet werden:

$ python -m pytest test_expect.py 
================ test session starts ================= 
platform darwin -- Python 2.7.9 -- py-1.4.26 -- pytest-2.7.0 
rootdir: /Users/okken/example, inifile: 
plugins: expect 
collected 1 items 

test_expect.py F 

====================== FAILURES ====================== 
_____________________ test_func ______________________ 
> expect('a' == 'b') 
test_expect.py:2 
-------- 
> expect(1 != 1) 
test_expect.py:3 
-------- 
> expect(a == b, 'a:%s b:%s' % (a,b)) 
a:1 b:2 
test_expect.py:6 
-------- 
Failed Expectations:3 
============== 1 failed in 0.01 seconds ============== 
+0

Aha! Das beantwortet meine Frage. Ich habe einfach einen Test ausgeführt, der mehrere Behauptungen enthielt. Ich werde auch das Pyret-Expect-Modul ausprobieren. –

+0

Beachten Sie, dass [Entwicklung auf 'Pytest-expect'] (https://github.com/okken/pytest-expect) eher abgestanden ist – Eric

5

Sie sollten in der Lage sein, dies mit dem Argument --maxfail zu steuern. Ich glaube, dass der Standard ist, um nicht für Fehler zu stoppen, also würde ich irgendwelche py.test Config-Dateien überprüfen, die Sie für einen Platz haben, der es überschreibt.

+0

Danke für Ihre schnelle Antwort. (Siehe meine aktualisierte Originalfrage oben für Informationen über meine Umgebung.) Leider scheint es nicht für mich zu arbeiten. PyTest gibt mir die gleiche Ausgabe, wenn ich --maxfail aufruft, als wenn ich ohne es laufen würde. Meine neue Befehlszeile lautet: python -m pytest --maxfail = 5 fail_me.py –

+0

'--maxfail' bestimmt, wie viele _tests fehlschlagen, nicht wie viele' assert'ions – Eric

7

Wie andere bereits erwähnt, würden Sie im Idealfall schreibe mehrere Tests und habe nur jeweils eine Assertion (das ist keine harte Grenze, aber eine gute Richtlinie).

Der @pytest.mark.parametrize Dekorateur macht dies einfach:

import pytest 

def parrot(i): 
    return i 

@pytest.mark.parametrize('inp, expected', [(0, 0), (1, 1), (2, 1), (2, 2)]) 
def test_parrot(inp, expected): 
    assert parrot(inp) == expected 

Wenn es mit -v läuft:

parrot.py::test_parrot[0-0] PASSED 
parrot.py::test_parrot[1-1] PASSED 
parrot.py::test_parrot[2-1] FAILED 
parrot.py::test_parrot[2-2] PASSED 

=================================== FAILURES =================================== 
_______________________________ test_parrot[2-1] _______________________________ 

inp = 2, expected = 1 

    @pytest.mark.parametrize('inp, expected', [(0, 0), (1, 1), (2, 1), (2, 2)]) 
    def test_parrot(inp, expected): 
>  assert parrot(inp) == expected 
E  assert 2 == 1 
E  + where 2 = parrot(2) 

parrot.py:8: AssertionError 
====================== 1 failed, 3 passed in 0.01 seconds ====================== 
+0

Danke, ich werde es untersuchen –

Verwandte Themen