Als ich den Testcode mit pytest schrieb, hatte ich Schwierigkeiten mit Mock, also habe ich ihn zusammengefasst.
Mock ist ein Modul, das Unit-Tests für bestimmte Objekte erleichtert.
Installieren Sie pytest
pip install pytest pytest-mock
Erstellen Sie den zu testenden Code
Verzeichnisaufbau
```bash
root
├─src
│ └─script.py ・ ・ ・ Zu testender Quellcode
└─tests
├─__init__.py ・ ・ ・ leere Datei
└─script.py ・ ・ ・ Testcode
```
Zu testender Quellcode
```python:src/script.py
import requests
def sample1(url):
return sample2(url)
def sample2(url):
try:
response = requests.get(url)
return response.status_code
except Exception:
return 0
class SampleClass:
def __init__(self):
self._req = requests
def get(self, url):
try:
response = self._req.get(url)
return response.status_code
except Exception:
return 0
```
Ersetzen Sie die Funktion sample2, wenn Sie die Funktion sample1 testen.
Testcode
tests/test_script.py
from src.script import sample1
def test_sample1_mock_sample2_200(mocker):
"""
Lassen Sie die sample2-Funktion 200 zurückgeben.
"""
status_code = 200
url = "https://hogehoge.com"
mocker.patch("src.script.sample2", return_value=status_code)
assert sample1(url) == status_code
def test_sample1_mock_sample2_404(mocker):
"""
Lassen Sie die sample2-Funktion 404 zurückgeben.
"""
status_code = 404
url = "https://fugafuga.com"
mocker.patch("src.script.sample2", return_value=status_code)
assert sample1(url) == status_code
Ausführungsergebnis
> pytest
======================== test session starts ========================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\root
plugins: cov-2.10.0, mock-3.3.1
collected 2 items
tests\test_script.py .. [100%]
========================= 2 passed in 0.19s =========================
Testcode
tests/test_script.py
from src.script import sample1
def test_sample1_mock_sample2(mocker):
"""
Die Funktion sample2 ist 200 per URL,404,Versuchen Sie, eine von 0 zurückzugeben.
"""
def return_status_code(url):
"""
200 per URL,404,Gibt einen von 0 zurück
"""
if url == "https://hogehoge.com":
return 200
elif url == "https://fugafuga.com":
return 404
else:
return 0
mocker.patch("src.script.sample2", side_effect=return_status_code)
assert sample1("https://hogehoge.com") == 200
assert sample1("https://fugafuga.com") == 404
assert sample1("https://higehige.com") == 0
Ausführungsergebnis
> pytest
======================== test session starts ========================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\root
plugins: cov-2.10.0, mock-3.3.1
collected 1 item
tests\test_script.py . [100%]
========================= 1 passed in 0.20s =========================
Testcode
tests/test_script.py
import pytest
from src.script import sample1
def test_sample1_mock_sample2_exception(mocker):
"""
Lösen Sie eine Ausnahme aus, wenn die Funktion sample2 aufgerufen wird.
"""
url = "https://hogehoge.com"
mocker.patch("src.script.sample2", side_effect=Exception)
with pytest.raises(Exception):
sample1(url)
Ausführungsergebnis
> pytest
======================== test session starts ========================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\root
plugins: cov-2.10.0, mock-3.3.1
collected 1 item
tests\test_script.py . [100%]
========================= 1 passed in 0.17s =========================
Ersetzen Sie die get-Funktion des Anforderungsmoduls, wenn Sie die sample2-Funktion testen.
Testcode
tests/test_script.py
import requests
from src.script import sample2
def test_sample2_mock_requests_200(mocker):
"""
Anforderungen, die von der sample2-Funktion ausgeführt werden.Ersetzen Sie get.
Der Rückgabewert ist auch der Status in Mock_Ersetzen Sie den Code so, dass er 200 zurückgibt.
"""
status_code = 200
url = "https://hogehoge.com"
response_mock = mocker.Mock()
response_mock.status_code = status_code
mocker.patch.object(requests, "get", return_value=response_mock)
assert sample2(url) == status_code
def test_sample2_mock_requests_404(mocker):
"""
Anforderungen, die von der sample2-Funktion ausgeführt werden.Ersetzen Sie get.
Der Rückgabewert ist auch der Status in Mock_Ersetzen Sie den Code so, dass er 404 zurückgibt.
"""
status_code = 404
url = "https://fugafuga.com"
response_mock = mocker.Mock()
response_mock.status_code = status_code
mocker.patch.object(requests, "get", return_value=response_mock)
assert sample2(url) == status_code
Ausführungsergebnis
> pytest
======================== test session starts ========================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\root
plugins: cov-2.10.0, mock-3.3.1
collected 1 item
tests\test_script.py .. [100%]
========================= 2 passed in 0.22s =========================
Testcode
tests/test_script.py
import requests
from src.script import sample2
def test_sample2_mock_request_exception(mocker):
"""
Anfragen mit sample2 Funktion.Lösen Sie eine Ausnahme aus, wenn get aufgerufen wird.
"""
status_code = 0
url = "https://hogehoge.com"
mocker.patch.object(requests, "get", side_effect=Exception)
assert sample2(url) == status_code
Ausführungsergebnis
> pytest
======================== test session starts ========================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\root
plugins: cov-2.10.0, mock-3.3.1
collected 1 item
tests\test_script.py . [100%]
========================= 1 passed in 0.19s =========================
Ersetzen Sie beim Testen der get-Methode der SampleClass-Klasse die get-Funktion von _req, die im Inneren aufgerufen wird.
Testcode
tests/test_script.py
from src.script import SampleClass
class TestSampleClass:
def test_get_200(self, mocker):
"""
Wird von der get-Methode von SampleClass aufgerufen_req.Ersetzen Sie get.
Der Rückgabewert ist auch der Status in Mock_Ersetzen Sie den Code so, dass er 200 zurückgibt.
"""
status_code = 200
url = "https://hogehoge.com"
sample = SampleClass()
response_mock = mocker.Mock()
response_mock.status_code = status_code
req_mock = mocker.MagicMock()
req_mock.get = mocker.Mock(return_value=response_mock)
mocker.patch.object(sample, "_req", req_mock)
assert sample.get(url) == status_code
Ausführungsergebnis
> pytest
======================== test session starts ========================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\root
plugins: cov-2.10.0, mock-3.3.1
collected 1 item
tests\test_script.py . [100%]
========================= 1 passed in 0.21s =========================
Testcode
tests/test_script.py
from src.script import SampleClass
class TestSampleClass:
def test_get_exception(self, mocker):
"""
Mit der get-Methode von SampleClass_req.Lösen Sie eine Ausnahme aus, wenn get aufgerufen wird.
"""
status_code = 0
url = "https://hogehoge.com"
sample = SampleClass()
req_mock = mocker.MagicMock()
req_mock.get = mocker.Mock(side_effect=Exception)
mocker.patch.object(sample, "_req", req_mock)
assert sample.get(url) == status_code
Ausführungsergebnis
> pytest
======================== test session starts ========================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\root
plugins: cov-2.10.0, mock-3.3.1
collected 1 item
tests\test_script.py . [100%]
========================= 1 passed in 0.21s =========================
Ich habe es gerade selbst recherchiert und ausprobiert, daher weiß ich nicht, ob es der richtige Weg ist, es zu verwenden.
Recommended Posts