pytest Lernzusammenfassung 2.13 - skip, xfail use the complete set

Dieser Artikel hat an der Veranstaltung „Newcomer Creation Ceremony“ teilgenommen, um gemeinsam den Weg der Goldschöpfung zu beginnen.

2.13 skip und xfail handhaben erfolglose Testfälle

  Markieren Sie Testfunktionen, die auf bestimmten Plattformen nicht funktionieren oder die Sie fehlschlagen lassen möchten, damit pytest sie entsprechend handhaben kann, und rendern Sie eine Zusammenfassung der Testsitzung, während die Testsuite grün bleibt. Überspringen bedeutet, dass Sie dies nur tun, wenn Sie sicher sind Bedingungen erfüllt sind, erwarten Sie nur, dass die Tests bestanden werden, andernfalls sollte pytest die Ausführung der Tests vollständig überspringen.

  Ein häufiges Beispiel ist das Überspringen von reinen Windows-Tests auf Nicht-Windows-Plattformen xfail bedeutet, dass Sie erwarten, dass der Test aus irgendeinem Grund fehlschlägt. Ein weiteres häufiges Beispiel ist das Testen auf noch nicht implementierte Funktionen oder noch nicht behobene Fehler.

  Wenn ein Test trotz eines erwarteten Fehlers (gekennzeichnet mit pytest.mark.xfail ) bestanden wird, ist dies ein xpass und wird in der Testzusammenfassung gemeldet.

2.13.1 Überspringen von Testfällen

1. Der Dekorateur markiert das Überspringen und übergibt den Grund für das Überspringen:

import pytest
@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...
复制代码

2. pytest.skip obligatorisch überspringen

def test_function():
    if not valid_config():
        pytest.skip("unsupported configuration")
复制代码

3. Anwendungsfälle bei der Parametrierung überspringen:

import pytest
@pytest.mark.parametrize("i", range(50))
def test_num(i):
    if i in (17, 25):
        pytest.skip("跳过用例")
复制代码

4. Plattformen überspringen sind alle Anwendungsfälle für den Sieg

import sys
import pytest
    if not sys.platform.startswith("win"):
    pytest.skip("skipping windows-only tests", allow_module_level=True)
复制代码

5. Anwendungsfälle mit bedingtem Überspringen

Wenn Sie etwas bedingt überspringen möchten, finden Sie hier ein Beispiel für eine Testfunktion, die zum Überspringen markiert ist, wenn sie auf Interpretern vor Python 3.10 ausgeführt wird:

import sys
@pytest.mark.skipif(sys.version_info < (3, 10), reason="requires python3.10 or higher˓→")
def test_function():
    ...
复制代码

6. Überspringen Sie bestimmte Testfälle basierend auf bestimmten Bedingungen

Teilen Sie Skipif-Flags zwischen Modulen (py-Dateien), um bestimmte Tests in einem Modul basierend auf bestimmten Bedingungen zu überspringen:

# content of test_mymodule.py
import mymodule
minversion = pytest.mark.skipif(mymodule.__versioninfo__ < (1, 1), reason="at least mymodule-1.1 required" )

@minversion
def test_function():
    pass
复制代码
# test_myothermodule.py
from test_mymodule import minversion

@minversion
def test_anotherfunction():
    pass
复制代码

7. Um eine Klasse zu überspringen, verwenden Sie das skipif-Tag für die Klasse

import pytest, sys
@pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows")
class TestPosixCalls:
def test_function(self):
    "will not be setup or run under 'win32' platform"
复制代码

8. Um alle Testfunktionen eines Moduls zu überspringen, können Sie das globale Test-Tag verwenden

import pytest
# test_module.py
pytestmark = pytest.mark.skipif(...)
复制代码

9. Dateien oder Verzeichnisse überspringen: Verwenden Sie einfach pytest gefolgt vom Anwendungsfall des entsprechenden Verzeichnisses

2.13.2 Markieren eines Testfalls als fehlgeschlagen

1. Verwenden Sie die xfail-Markierung, um anzugeben, dass der Test fehlschlagen soll:

@pytest.mark.xfail
def test_function():
    ...
复制代码

2. Setup während des Testlaufs fehlgeschlagen

Nach dem Aufruf von pytest.xfail() wird kein weiterer Code ausgeführt. Dies liegt daran, dass dies intern durch das Auslösen einer bekannten Ausnahme geschieht.

import pytest
@pytest.mark.parametrize("i", range(50))
def test_num(i):
    if i in (17, 25):
        pytest.xfail("预期失败")
复制代码

3. Ausfall unter einer bestimmten Bedingung, Ursache

@pytest.mark.xfail(sys.platform == "win32", reason="bug in a 3rd party library")
def test_function():
    ...
复制代码

4. Verbieten Sie die Ausführung markierter Anwendungsfälle

@pytest.mark.xfail(run=False)
def test_function():
    ...
复制代码

5. Legen Sie strict fest, um das Ergebnis der Testfallausführung von xfail als Fehler zu werten

import pytest
@pytest.mark.xfail(strict=True)
def test_function():
    pass
复制代码
[pytest]
xfail_strict=true
复制代码

6. Verwandte Codebeispiele

import pytest
xfail = pytest.mark.xfail
@xfail
def test_hello():
    assert 0
@xfail(run=False)
def test_hello2():
    assert 0
@xfail("hasattr(os, 'sep')")
def test_hello3():
    assert 0
@xfail(reason="bug 110")
def test_hello4():
    assert 0
@xfail('pytest.__version__[0] != "17"')
def test_hello5():
    assert 0
def test_hello6():
    pytest.xfail("reason")
@xfail(raises=IndexError)
def test_hello7():
    x = []
    x[1] = 1
复制代码
C:\Users\mc\Desktop\python基础>pytest -rx test_module.py
======================================================================= test session starts ========================================================================
platform win32 -- Python 3.9.6, pytest-7.1.1, pluggy-0.13.1
rootdir: C:\Users\mc\Desktop\python基础
collected 7 items                                               
test_module.py xxxxxxx                               [100%]

===================================================================== short test summary info ======================================================================
XFAIL test_module.py::test_hello
XFAIL test_module.py::test_hello2
  reason: [NOTRUN]
XFAIL test_module.py::test_hello3
  condition: hasattr(os, 'sep')
XFAIL test_module.py::test_hello4
  bug 110
XFAIL test_module.py::test_hello5
  condition: pytest.__version__[0] != "17"
XFAIL test_module.py::test_hello6
  reason: reason
XFAIL test_module.py::test_hello7
======================================================================== 7 xfailed in 0.19s ========================================================================
复制代码

2.13.3 Verwenden von parametrisiertem Überspringen/Verlassen

import sys
import pytest
@pytest.mark.parametrize(
    ("n", "expected"),
    [
        (1, 2),
        pytest.param(1, 0, marks=pytest.mark.xfail),
        pytest.param(1, 3, marks=pytest.mark.xfail(reason="some bug")),
        (2, 3),
        (3, 4),
        (4, 5),
        pytest.param(10, 11, marks=pytest.mark.skipif(sys.version_info >= (3, 0), reason="py2k˓→")),
    ],
)
def test_increment(n, expected):
    assert n + 1 == expected
复制代码
C:\Users\mc\Desktop\python>pytest -vs test_module.py
======================================================================= test session starts ========================================================================
platform win32 -- Python 3.9.6, pytest-7.1.1, pluggy-0.13.1 -- c:\python39\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\mc\Desktop\python
collected 7 items

test_module.py::test_increment[1-2] PASSED
test_module.py::test_increment[1-0] XFAIL
test_module.py::test_increment[1-3] XFAIL (some bug)
test_module.py::test_increment[2-3] PASSED
test_module.py::test_increment[3-4] PASSED
test_module.py::test_increment[4-5] PASSED
test_module.py::test_increment[10-11] SKIPPED (py2k˓→)
============================================================= 4 passed, 1 skipped, 2 xfailed in 0.12s ==============================================================
复制代码

Ich denke du magst

Origin juejin.im/post/7085359646977835022
Empfohlen
Rangfolge