Ich hatte bisher selten ** "Testcode" ** geschrieben, aber ich hatte die Möglichkeit, Python-Testcode zu schreiben und lernte, wie man ihn in Eile benutzt. In diesem Artikel habe ich mich auf die Verwendung von pytest konzentriert, einem Framework für Unit-Tests von Python.
Referenz: Offizielles Dokument (https://docs.pytest.org/en/latest/contents.html)
Ein Framework für Unit-Tests in Python. Es gibt eine ähnliche, die als unittest bezeichnet wird, aber pytest scheint populärer zu sein. Das Folgende sind die Merkmale von Pytest
pip install -U pytest
Grundsätzlich können Sie den Test wie folgt ausführen.
--Schreiben Sie den Testfall mit assert <bedingter Ausdruck>
Wenn Sie den Dateinamen und den Methodennamen in "test_ *" eingeben, wird der Testcode automatisch gefunden (Sie können ihn auch selbst angeben).
test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
Erstellen Sie die obige Datei test_sample.py und Führen Sie "pytest" aus.
Dann wird das folgende Testergebnis angezeigt.
========================================== test session starts ===========================================
platform darwin -- Python 3.7.6, pytest-5.4.3, py-1.8.1, pluggy-0.13.1
rootdir: /Users/xin/work/study/pytest
plugins: hypothesis-5.5.4, arraydiff-0.3, remotedata-0.3.2, openfiles-0.4.0, doctestplus-0.5.0, astropy-header-0.1.2
collected 1 item
test_sample.py F [100%]
================================================ FAILURES ================================================
______________________________________________ test_answer _______________________________________________
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:5: AssertionError
======================================== short test summary info =========================================
FAILED test_sample.py::test_answer - assert 4 == 5
=========================================== 1 failed in 0.18s ============================================
Ausnahmetests sind mit pytest.raises
möglich
error_sample.py
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
Durch Erstellen einer Klasse mit dem Präfix "Test" können Sie gleichzeitig die internen Testmethoden testen.
test_class.py
class TestClass:
def test_one(self):
x = "this"
assert "h" in x
def test_two(self):
x = "hello"
assert hasattr(x, "check")
Ein Tool zum Einrichten einer Testausführungsumgebung. Ich werde einige nützliche aufgreifen. Einzelheiten finden Sie unten (https://docs.pytest.org/en/latest/fixture.html).
tmpdir
Mit dem tmpdir
-Fixture können Sie ein eindeutiges Verzeichnis erstellen, das während des Tests vorübergehend verfügbar ist.
test_tempdir.py
import os
def test_create_file(tmpdir):
p = tmpdir.mkdir("sub").join("hello.txt") #Temporäres Verzeichnis erstellen
p.write("content")
assert p.read() == "content"
assert len(tmpdir.listdir()) == 1
assert 0
monkeypatch Mit dem Monkeypatch-Gerät können Sie ein Objekt verspotten. Angenommen, Sie haben den folgenden Produktcode und ein "get_value ()" ist eine Funktion, die nicht einfach ausgeführt werden kann.
monkeypatch_product.py
def return_value(): #Produktcode
a = get_value()
return a
def get_value(): #Funktionen, die nicht einfach ausgeführt werden können
return 1
Zu diesem Zeitpunkt können Sie den Test ausführen, indem Sie get_value () durch Ihre eigene Mock-Funktion durch monkeypatch.setattr ersetzen.
monkeypatch_test.py
import monkeypatch_product
#Testcode
def test_return_value(monkeypatch):
def mock_get_value():
return 100
#Ersetzt durch Scheinfunktion
monkeypatch.setattr(monkeypatch_product, "get_value", mock_get_value)
res = monkeypatch_product.return_value()
assert res == 100
Sie können Umgebungsvariablen auch mit monkeypatch.setenv
verspotten.
monkeypatch_env.py
import os
#Produktcode
def get_os_user_lower():
username = os.getenv("USER")
if username is None:
raise OSError("USER environment is not set.")
return username.lower()
#Testcode
def test_get_os_user_lower(monkeypatch):
monkeypatch.setenv("USER", "TestingUser")
assert get_os_user_lower() == "testinguser"
Recommended Posts