[PYTHON] Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen

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.

Über Pytest und Pytest-Mock

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/

Methode zur Erklärung

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.

Ersetzen Sie "Mailer.send" durch ein Modell

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

Ich möchte die Anzahl der Anrufe überprüfen

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

Ich möchte überprüfen, ob es nicht aufgerufen wird

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()

Ich möchte die Parameter überprüfen

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')])

Ich möchte den Rückgabewert steuern

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

Ich möchte eine Ausnahme machen

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

Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
Ich habe versucht, die im Geschäftsleben häufig verwendeten Befehle zusammenzufassen
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, den Befehl umask zusammenzufassen
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, die Befehle zusammenzufassen, die Anfängeringenieure heute verwenden
Ich habe versucht, die Trapezform des Bildes zu korrigieren
LeetCode Ich habe versucht, die einfachen zusammenzufassen
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, die logische Denkweise über Objektorientierung zusammenzufassen.
[Linux] Ich habe versucht, die sichere Bestätigungsmethode von FQDN (CentOS7) zu überprüfen.
Ich habe versucht, die Linux-Befehle zusammenzufassen, die heute von Anfängeringenieuren verwendet werden - Teil 1-
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich habe versucht, die Einstellungen für verschiedene Datenbanken von Django (MySQL, PostgreSQL) zusammenzufassen.
Ich habe versucht, die Operationen zusammenzufassen, die wahrscheinlich mit numpy-stl verwendet werden
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, SparseMatrix zusammenzufassen
Ich habe versucht, die Methode zur Mittelung der Dollarkosten zu simulieren
Ich habe die Größenänderung von TensorFlow nicht verstanden und sie daher visuell zusammengefasst.
Ich habe die einfachste Methode zur Klassifizierung von Dokumenten mit mehreren Etiketten ausprobiert
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
[Python] Ich habe versucht, das Array, die Wörterbuchgenerierungsmethode, die Schleifenmethode und die Listeneinschlussnotation zusammenzufassen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
[Erste COTOHA-API] Ich habe versucht, die alte Geschichte zusammenzufassen
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht zusammenzufassen, wie das EPEL-Repository erneut verwendet wird
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, die häufig verwendete Seaborn-Methode mit so wenig Argumenten wie möglich anzuwenden [für Anfänger]
Ich möchte den Namen der ausgeführten Funktion / Methode erhalten
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe den Befehl worldcup verwendet, um das Ergebnis der Weltmeisterschaft zu überprüfen.
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Python3-Standardeingabe habe ich versucht zusammenzufassen
Ich habe versucht, der CPython-Implementierung ein Post-Inkrement hinzuzufügen
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, die COTOHA-API zu berühren
Ich habe versucht, den Inhalt jedes von Python pip gespeicherten Pakets in einer Zeile zusammenzufassen
Ich habe versucht, Ansibles Module-Linux-Edition zusammenzufassen
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Implementierung ~
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
[Python] Ich habe versucht, den kollektiven Typ (Satz) auf leicht verständliche Weise zusammenzufassen.
Ich versuchte zusammenzufassen, bis ich die Bank verließ und Ingenieur wurde