[PYTHON] Zählen / überprüfen Sie die Anzahl der Methodenaufrufe.

Dies hängt von dem zuvor erwähnten Snippet (http://qiita.com/items/1321) ab. Es zählt / validiert Methodenaufrufe in Tests.

from unittest import TestCase


class CallCounter(object):
    """Check a numbe of time a callable is called."""

    def __new__(cls, *args, **kargs):
        inst = super(CallCounter, cls).__new__(cls, *args, **kargs)
        inst._patch_mgr = PatchManager()
        inst._targets = {}
        return inst

    class FailedVerification(Exception):
        pass

    class CallCountManager(object):
        def __init__ (self, target, name, expected):
            self.__target = target
            self.__name = name
            self.__original = getattr(target, name)
            self.__count = 0
            self.__expected = expected

        def __call__(self, *args, **kargs):
            self.__count += 1
            return self.__original(*args, **kargs)

        def __verify(self):
            if self.__count == self.__expected:
                return

            msg = '%s.%s should be called %d times but %d' % \
                  (self.__target.__name__, self.__name, self.__expected,
                   self.__count,)
            raise CallCounter.FailedVerification(msg)

    def ensure(self, target, name, count):
        counter = self.CallCountManager(target, name, count)
        key = '%s.%s'%(target.__name__, name)
        self._targets[key] = counter
        self._patch_mgr.attach(target, name, counter)
        return

    def verify(self):
        for key, counter in self._targets.iteritems():
            counter._CallCountManager__verify()
        return

    def end(self):
        self._patch_mgr.detach_all()
        return

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.end()
        if exc_type:
            return False
        return True


class TestCallCounter(TestCase):
    """Test for test.CallCounter."""

    def test_1(self):
        """Call it simply."""

        c = CallCounter()

        import datetime
        original = datetime.datetime
        c.ensure(datetime, 'datetime', 1)
        self.assert_(isinstance(datetime.datetime,
                                CallCounter.CallCountManager))
        self.assertNotEqual(datetime.datetime, original)

        # Call it first.
        datetime.datetime(year=2011, month=3, day=4)
        c.verify()

        # Call it second.
        datetime.datetime(year=2011, month=3, day=4)
        with self.assertRaises(CallCounter.FailedVerification):
            c.verify()

        # Verify a clearance.
        c.end()
        self.assertEqual(datetime.datetime, original)

        return

    def test_2(self):
        """Call it simply."""

        c = CallCounter()

        import datetime
        original = datetime.datetime
        c.ensure(datetime, 'datetime', 0)
        self.assertNotEqual(datetime.datetime, original)

        # Call it and verify.
        datetime.datetime(year=2011, month=3, day=4)
        with self.assertRaises(CallCounter.FailedVerification):
            c.verify()

        c.end()
        self.assertEqual(datetime.datetime, original)

        return

    def test_3(self):
        """Use it with `with statement`."""

        import datetime
        original = datetime.datetime
        with self.assertRaises(CallCounter.FailedVerification):
            with CallCounter() as c:
                c.ensure(datetime, 'datetime', 0)
                self.assertNotEqual(datetime.datetime, original)

                # Call it and verify.
                datetime.datetime(year=2011, month=3, day=4)
                c.verify()

        self.assertEqual(datetime.datetime, original)

        return

    def test_4(self):
        """Exception is happend in with statement."""

        import datetime
        original = datetime.datetime
        with self.assertRaises(AssertionError):
            with CallCounter() as c:
                c.ensure(datetime, 'datetime', 0)
                self.assertNotEqual(datetime.datetime, original)

                # Call it and verify.
                datetime.datetime(year=2011, month=3, day=4)
                raise AssertionError()

        self.assertEqual(datetime.datetime, original)

        return

Recommended Posts

Zählen / überprüfen Sie die Anzahl der Methodenaufrufe.
Zählen Sie die Anzahl der Zeichen mit Echo
10. Zählen der Anzahl der Zeilen
Zählen Sie die Anzahl der Parameter im Deep-Learning-Modell
Holen Sie sich die Anzahl der Ziffern
Berechnen Sie die Anzahl der Änderungen
Zählen Sie die Anzahl der Zeichen im Text in der Zwischenablage auf dem Mac
[Homologie] Zählen Sie mit Python die Anzahl der Löcher in den Daten
Holen Sie sich die Anzahl der Ansichten von Qiita
Berechnung der Anzahl der Assoziationen von Klamer
Holen Sie sich die Anzahl der Youtube-Abonnenten
Zählen Sie die Anzahl der thailändischen und arabischen Zeichen in Python gut
Ich habe die X-Means-Methode untersucht, mit der die Anzahl der Cluster automatisch geschätzt wird
[Linux] Ich habe versucht, die sichere Bestätigungsmethode von FQDN (CentOS7) zu überprüfen.
4 Methoden zum Zählen der Anzahl von Ganzzahlen in einem bestimmten Intervall (einschließlich der imos-Methode) [Python-Implementierung]
Geben Sie die Anzahl der CPU-Kerne in Python aus
Informationen zur Genauigkeit der Berechnungsmethode für das Umfangsverhältnis von Archimedes
Clustering-Methode Clustering
Berechnen Sie die Gesamtzahl der Kombinationen mit Python
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Teilen Sie die Zeichenfolge in die angegebene Anzahl von Zeichen
Finden Sie die Anzahl der Tage in einem Monat
Minimieren Sie die Anzahl der Polierungen, indem Sie die Kombination optimieren
Bestimmen Sie die Anzahl der Klassen mithilfe der Starges-Formel
So zählen Sie die Anzahl der Vorkommen jedes Elements in der Liste in Python mit der Gewichtung
Überprüfen Sie die Verarbeitungszeit und die Anzahl der Aufrufe für jeden Prozess mit Python (cProfile).
Berechnung der kürzesten Route nach der Monte-Carlo-Methode
[Python] Ein Programm, das die Anzahl der Täler zählt
Projecet Euler 12 Ermitteln Sie die Anzahl der Brüche ohne Division.
So ermitteln Sie die Anzahl der Stellen in Python
Beziehung der Fibonacci-Zahlenreihe und des Goldenen Schnitts
Berechnung der minimal erforderlichen Stimmenzahl aus der Stimmenzahl
Zerstören Sie den Zwischenausdruck der Sweep-Methode mit Python
Versuchen Sie, die Anzahl der Likes auf Twitter zu schätzen
Sagen Sie die Anzahl der mit COVID-19 infizierten Personen mit Prophet voraus
Ermitteln Sie die Größe (Anzahl der Elemente) von Union Find in Python
[Zusammenfassung von 27 Sprachen] Berechnungsmethode für meine Nummernprüfziffer
Verwalten Sie die Paketversionsnummer von require.txt mit pip-tools
[Python] Ermittelt die Anzahl der Aufrufe aller veröffentlichten Artikel
Ich habe die einfachste Methode zur Klassifizierung von Dokumenten mit mehreren Etiketten ausprobiert
Visualisieren Sie die Anzahl der Beschwerden von Lebensversicherungsunternehmen
Die Kopiermethode von pandas.DataFrame ist standardmäßig Deep Copy
Clustering G-bedeutet, dass die Anzahl der Cluster automatisch bestimmt wird
Der Beginn von cif2cell
Die Bedeutung des Selbst
der Zen von Python
Die Geschichte von sys.path.append ()
Zusammenfassung der Testmethode
Rache der Typen: Rache der Typen
Erhöhen Sie die Geschwindigkeit der Monte-Carlo-Methode zur Implementierung von Cython-Ausschnitten.
So finden Sie die optimale Anzahl von Clustern für k-means
Maya | Ermitteln Sie die Anzahl der Polygone im ausgewählten Objekt
Eine einfache Python-Implementierung der k-Neighborhood-Methode (k-NN)
Untersuchen Sie den Fehlerbereich bei der Anzahl der Todesfälle aufgrund einer Lungenentzündung
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
Python - Ermitteln Sie die Anzahl der Gruppen im regulären Ausdruck
Dekorateur, der am Ende der Methode "FIN-Methodenname" anzeigt