Jak wyłączyć test przy użyciu pytest?

86

Powiedzmy, że mam kilka testów:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

Czy istnieje dekorator lub coś podobnego, które mógłbym dodać do funkcji, aby zapobiec pytesturuchomieniu tylko tego testu? Wynik może wyglądać jak ...

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

def test_func_two():
    ...

def test_func_three():
    ...
ericmjl
źródło

Odpowiedzi:

133

Pytest ma dekoratory skip i skipif, podobne do modułu Python unittest (używającego skipi skipIf), które można znaleźć w dokumentacji tutaj .

Przykłady z linku można znaleźć tutaj:

@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():
    ...

Pierwszy przykład zawsze pomija test, drugi pozwala warunkowo pomijać testy (świetne, gdy testy zależą od platformy, wersji wykonywalnej lub opcjonalnych bibliotek.

Na przykład, jeśli chcę sprawdzić, czy ktoś ma zainstalowane pandy biblioteczne do testu.

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
źródło
Czy jest coś podobnego do elegancji, .skipktórą ma Mocha (Node.js)? it('tests something'...)-> it.skip('tests something'...)co spowodowałoby wyłączenie tego konkretnego testu. Ma również przydatne przeciwieństwo: .onlyktóry uruchomi tylko ten test i nic więcej.
Juha Untinen
Chodzi mi o to, że onlymożesz to zrobić za pomocą wiersza poleceń lub czegokolwiek, czego używasz do inicjalizacji programu uruchamiającego test: stackoverflow.com/a/36539692/4131059 Jeśli chodzi o iti it.skip, uważam, że funkcjonalność tutaj w pełni to obejmuje.
Alexander Huszagh
21

skipDekorator będzie wykonać zadanie:

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

( reasonargument jest opcjonalny, ale zawsze dobrze jest określić, dlaczego test jest pomijany).

Istnieje również skipif()możliwość wyłączenia testu, jeśli zostanie spełniony określony warunek.


Te dekoratory można zastosować do metod, funkcji lub klas.

Aby pominąć wszystkie testy w module , zdefiniuj pytestmarkzmienną globalną :

# test_module.py
pytestmark = pytest.mark.skipif(...)
alecxe
źródło
10

Nie jestem pewien, czy jest przestarzały, ale możesz też użyć tej pytest.skipfunkcji w teście:

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3
Wayne Werner
źródło
2
przyszedł po pytest o pomoc, został w sprawie referencji
Uzebeckatrente
do czego się odnosi. Muszę wiedzieć
XChikuX
@XChikuX youtube.com/watch?v=xOrgLj9lOwk
Wayne Werner
Obawiam się, że to było na długo przed moim czasem. Ale cieszę się, że teraz to wiem.
XChikuX
6

Możesz także chcieć uruchomić test, nawet jeśli podejrzewasz, że się nie powiedzie. W takim scenariuszu https://docs.pytest.org/en/latest/skipping.html sugeruje użycie dekoratora @ pytest.mark.xfail

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

W takim przypadku Pytest nadal przeprowadzi Twój test i poinformuje Cię, czy zakończy się powodzeniem, czy nie, ale nie będzie narzekał i nie zepsuje kompilacji.

Ruben Gasparian
źródło
2

Jeśli chcesz pominąć test, ale nie zakodować na stałe znacznika, lepiej użyj wyrażenia kluczowego, aby go ominąć.

pytest test/test_script.py -k 'not test_func_one'
Arindam Roychowdhury
źródło
1

Możesz oznaczyć test przy użyciu dekoratorów skipi, skipifjeśli chcesz pominąć test pytest.

Pomijanie testu

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

Najprostszym sposobem pominięcia testu jest oznaczenie go skipdekoratorem, który może zostać zaliczony opcjonalniereason .

Możliwe jest również bezwzględne pominięcie podczas wykonywania testu lub konfiguracji przez wywołanie pytest.skip(reason)funkcji. Jest to przydatne, gdy nie można ocenić warunku pominięcia w czasie importu.

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

Pomijanie testu na podstawie warunku

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

Jeśli chcesz pominąć na podstawie warunku, możesz użyć skipifzamiast tego. W poprzednim przykładzie funkcja test jest pomijana, gdy jest uruchamiana na interpreterze wcześniejszym niż Python3.6.

Wreszcie, jeśli chcesz pominąć test, ponieważ masz pewność, że się nie powiedzie, możesz również rozważyć użycie xfailznacznika do wskazania, że ​​spodziewasz się, że test się nie powiedzie.

lmiguelvargasf
źródło