Ich habe überprüft, wie man Pytest-Mock verwendet, also machen Sie sich eine Notiz Es ist mühsam, die Anwendungsfälle zu überprüfen, die wahrscheinlich in Zukunft verwendet werden, deshalb habe ich sie zusammengefasst. Es ist ein Artikel, den ich einen Tag nach der Überprüfung von pytest geschrieben habe. Ich denke, es gibt verschiedene Exzesse und Mängel, aber ich würde ihn gerne aktualisieren, wenn ich einen besseren Weg finde.
Dies ist eine der Bibliotheken, die bei der Implementierung von Python-Testcode verwendet werden. Weitere Informationen finden Sie auf der offiziellen Website.
pytest https://docs.pytest.org/en/latest/index.html
pytest-mock https://pypi.org/project/pytest-mock/
Die folgende Hoge-Methode ist das Testziel.
from mailer import Mailer
#Beispielnachrichten
# ['1. Text', 'Zweiter Text']
def hoge(messages):
try:
#Senden Sie so viele E-Mails, wie Nachrichten vorhanden sind
for message in messages:
has_error = Mailer.send(message)
if has_error:
#1 wird zurückgegeben, wenn ein Fehler auftritt
return 1
#Geben Sie am Ende des Normalwerts 0 zurück
return 0
except Exception as e:
#Geben Sie 2 zurück, wenn eine Ausnahme auftritt
return 2
Die zum Zeitpunkt des Schreibens dieses Artikels verwendete Version lautet wie folgt.
test_hoge.py
from hoge import hoge
from mailer import Mailer
from unittest.mock import call
def test_hoge(mocker):
# Mailer.Ersetzen Sie send durch mock
mailer_mock = mocker.patch.object(Mailer, 'send')
messages = ['1. Text', 'Zweiter Text']
#Mailer oben.Da send ein Mock ist, ist es ein echter Mailer, auch wenn Sie hoge ausführen.send wird nicht ausgeführt
assert hoge(messages) == 0
test_hoge.py
from hoge import hoge
from mailer import Mailer
from unittest.mock import call
def test_hoge(mocker):
# Mailer.Ersetzen Sie send durch mock
mailer_mock = mocker.patch.object(Mailer, 'send')
messages = ['1. Text', 'Zweiter Text']
assert hoge(messages) == 0
# Mailer.Sie können sehen, dass send zweimal aufgerufen wird
assert mailer_mock.call_count == 2
test_hoge.py
from hoge import hoge
from mailer import Mailer
from unittest.mock import call
def test_hoge(mocker):
# Mailer.Ersetzen Sie send durch mock
mailer_mock = mocker.patch.object(Mailer, 'send')
#Da Nachrichten leer sind, Mailer. verhindern, dass send aufgerufen wird
messages = []
assert hoge(messages) == 0
# Mailer.Stellen Sie sicher, dass send nicht aufgerufen wird
mailer_mock.assert_not_called()
test_hoge.py
from hoge import hoge
from mailer import Mailer
from unittest.mock import call
def test_hoge(mocker):
# Mailer.Ersetzen Sie send durch mock
mailer_mock = mocker.patch.object(Mailer, 'send')
messages = ['1. Text', 'Zweiter Text']
assert hoge(messages) == 0
#Das erste Mal'1. Text', Das zweite Mal'Zweiter Text'Kann überprüft werden, ob übergeben und mit einem Parameter aufgerufen wird
mailer_mock.assert_has_calls([call('1. Text'), call('Zweiter Text')])
test_hoge.py
from hoge import hoge
from mailer import Mailer
from unittest.mock import call
def test_hoge(mocker):
# side_Übergeben Sie eine Liste von Rückgabewerten als Array, um dies zu bewirken
#Jedes Mal, wenn es aufgerufen wird, wird es in der Reihenfolge vom Anfang des Arrays zurückgegeben
#In diesem Beispiel wird beim ersten Mal False und beim zweiten Mal True zurückgegeben.
mailer_mock = mocker.patch.object(Mailer, 'send', side_effect = [False, True])
messages = ['1. Text', 'Zweiter Text']
#Zweiter Mailer.Da send True zurückgibt, können Sie den Rückgabewert 1 überprüfen.
assert hoge(messages) == 1
test_hoge.py
from hoge import hoge
from mailer import Mailer
from unittest.mock import call
def test_hoge(mocker):
# side_Geben Sie eine Ausnahme für den Effekt an
#In diesem Beispiel ist das erste Mal False und das zweite Mal eine Ausnahme.
mailer_mock = mocker.patch.object(Mailer, 'send', side_effect = [False, Exception('error')])
messages = ['1. Text', 'Zweiter Text']
#Zweiter Mailer.Sie können den Rückgabewert 2 überprüfen, da send eine Ausnahme auslöst
assert hoge(messages) == 2
Recommended Posts