Wie deaktiviere ich einen Test mit pytest?

87

Angenommen, ich habe eine Reihe von Tests:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

Gibt es einen Dekorateur oder ähnliches, das ich zu den Funktionen hinzufügen könnte, um zu verhindern pytest, dass nur dieser Test ausgeführt wird? Das Ergebnis könnte ungefähr so ​​aussehen ...

@pytest.disable()
def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...
ericmjl
quelle

Antworten:

135

Pytest verfügt über die Skip- und Skipif-Dekoratoren, ähnlich dem Python-Unittest-Modul (das skipund verwendet skipIf), das in der Dokumentation hier zu finden ist .

Beispiele aus dem Link finden Sie hier:

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

import sys
@pytest.mark.skipif(sys.version_info < (3,3),
                    reason="requires python3.3")
def test_function():
    ...

Im ersten Beispiel wird der Test immer übersprungen, im zweiten Beispiel können Sie Tests unter bestimmten Bedingungen überspringen (ideal, wenn die Tests von der Plattform, der ausführbaren Version oder den optionalen Bibliotheken abhängen.

Zum Beispiel, wenn ich überprüfen möchte, ob jemand die Bibliothekspandas für einen Test installiert hat.

import sys
try:
    import pandas as pd
except ImportError:
    pass

@pytest.mark.skipif('pandas' not in sys.modules,
                    reason="requires the Pandas library")
def test_pandas_function():
    ...
Alexander Huszagh
quelle
Gibt es etwas Ähnliches wie das elegante .skip, das Mocha (Node.js) hat? it('tests something'...)-> it.skip('tests something'...)was diesen bestimmten Test deaktivieren würde. Es hat auch das praktische Gegenteil: Es .onlywird nur diesen Test ausführen und sonst nichts.
Juha Untinen
Ich meine, für den onlyTeil können Sie dies über die Befehlszeile oder was auch immer Sie verwenden, um den Testläufer zu initialisieren: stackoverflow.com/a/36539692/4131059 Was das itund betrifftit.skip , glaube ich, dass die Funktionalität hier dies vollständig abdeckt.
Alexander Huszagh
21

Der skipDekorateur würde den Job machen:

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    # ...

(reason Argument ist optional, aber es ist immer eine gute Idee anzugeben, warum ein Test übersprungen wird).

Es gibt auch skipif()die Möglichkeit, einen Test zu deaktivieren, wenn eine bestimmte Bedingung erfüllt ist.


Diese Dekoratoren können auf Methoden, Funktionen oder Klassen angewendet werden.

Um alle Tests in einem Modul zu überspringen , definieren Sie eine globale pytestmarkVariable:

# test_module.py
pytestmark = pytest.mark.skipif(...)
Alecxe
quelle
10

Ich bin nicht sicher, ob es veraltet ist, aber Sie können die pytest.skipFunktion auch innerhalb eines Tests verwenden:

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3
Wayne Werner
quelle
2
kam für die pytest Hilfe, blieb als Referenz
Uzebeckatrente
worauf bezieht es sich? Ich muss wissen
XChikuX
@XChikuX youtube.com/watch?v=xOrgLj9lOwk
Wayne Werner
Ich fürchte, das war lange vor meiner Zeit. Aber ich bin froh, dass ich es jetzt weiß.
XChikuX
6

Möglicherweise möchten Sie den Test auch ausführen, wenn Sie den Verdacht haben, dass der Test fehlschlägt. Für ein solches Szenario empfiehlt https://docs.pytest.org/en/latest/skipping.html die Verwendung von decorator @ pytest.mark.xfail

@pytest.mark.xfail
def test_function():
    ...

In diesem Fall führt Pytest Ihren Test weiterhin aus und teilt Ihnen mit, ob er erfolgreich ist oder nicht, beschwert sich jedoch nicht und bricht den Build nicht.

Ruben Gasparian
quelle
2

Wenn Sie den Test überspringen möchten, aber keinen Marker fest codieren möchten, verwenden Sie besser den Schlüsselwortausdruck, um ihn zu umgehen.

pytest test/test_script.py -k 'not test_func_one'
Arindam Roychowdhury
quelle
1

Sie können einen Test mit dem skipund den skipifDekorateuren markieren, wenn Sie einen Test überspringen möchten pytest.

Test überspringen

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    ...

Der einfachste Weg, einen Test zu überspringen, besteht darin, ihn mit dem skipDekorateur zu markieren, der optional bestanden werden kann reason.

Es ist auch möglich, während der Testausführung oder -einrichtung durch Aufrufen der pytest.skip(reason)Funktion unbedingt zu überspringen . Dies ist nützlich, wenn es nicht möglich ist, die Sprungbedingung während der Importzeit auszuwerten.

def test_func_one():
    if not valid_config():
        pytest.skip("unsupported configuration")

Überspringen eines Tests basierend auf einer Bedingung

@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_func_one():
    ...

Wenn Sie basierend auf einer Bedingung überspringen möchten, können Sie skipifstattdessen verwenden. Im vorherigen Beispiel wird die Testfunktion übersprungen, wenn sie auf einem Interpreter vor Python3.6 ausgeführt wird.

Wenn Sie einen Test überspringen möchten, weil Sie sicher sind, dass er fehlschlägt, können Sie auch die xfailMarkierung verwenden, um anzuzeigen, dass ein Test fehlschlagen soll.

lmiguelvargasf
quelle