Hinweise zur Verwendung des Python-Standards unittest

Einführung

Positionierung dieses Memos

Dieser Kommentar ist eine kurze Aufzeichnung der Verwendung der unittest-Funktion von Python. Der Zweck besteht darin, die Unit-Test-Funktion von Python zu erläutern, ein einfaches Beispiel bereitzustellen und eine Vorlage bereitzustellen, wenn Sie in Zukunft Tests durchführen möchten.

Es geht nicht darum, wie man doctest benutzt.

Ich denke auch, dass ich Nosetests verwende, wenn ich viele Tests durchführe, aber das erkläre ich auch nicht.

** Wenn Sie ein Buch oder ein offizielles Dokument lesen, erhalten Sie natürlich nützliches Wissen. Wenn Sie es bei der Arbeit verwenden, sollten Sie stattdessen ein geeignetes lesen. Für jeden. ** ** **

Ziel Python-Version

Python 2.7.11

Python

Was ist ein Python-Unit-Test?

Eine Gruppe von Modulen, die nützliche Funktionen zum Testen von Python-Code implementieren. Es ist in der Python-Ausführungsumgebung enthalten und sollte verfügbar sein, wenn Python installiert ist. Es kann durch Importieren wie folgt verwendet werden.

import unittest

Es scheint viele andere Testwerkzeuge zu geben. Werfen Sie einen Blick auf die Websites auf Referenzen.

Offizielle Dokumentation

Weitere Informationen zu den Funktionen von Python unittest finden Sie in der offiziellen Dokumentation.

Zunächst wird kurz beschrieben, welche Art von Funktion es hat. Danach werden Beispiele für die Verwendung gezeigt, damit viele Benutzer diese Verwendung unterdrücken können. Ab der mittleren Phase gibt es Details zu jeder Funktion und eine Liste der Assert-Hogehoge-Methoden, die zum Testen verwendet werden.

Englische Version: https://docs.python.org/2.7/library/unittest.html Japanische Version: https://docs.python.org/ja/2.7/library/unittest.html#module-unittest

Wie benutzt man

Wie benutzt man

Die grundlegende Verwendung ist wie folgt.

  1. Importieren Sie unittest
  2. Erstellen Sie eine Klasse TestHOGEHOGE, die unittest.TestCase erbt
  3. Beschreiben Sie den Testfall in TestHOGEHOGE. Der Testfall verwendet eine Reihe von Methoden mit dem Namen AssertHOGE (). Diese Methode vergleicht die Übereinstimmung, die Größenbeziehung usw.
  4. Führen Sie den Test mit unittest.main () aus. Wenn das gewünschte Ergebnis erzielt wird, ist das Ergebnis Erfolg, andernfalls Misserfolg.

Das grundlegendste Beispiel

Angenommen, Sie haben einen geeigneten Code. Zum Beispiel die folgende Methode, die nur hinzugefügt wird.

tashizan.py



def tashizan(a, b):
    """ calculate (a + b)
    """
    return a + b

Ich möchte das testen. Die Funktion, die erfüllt sein sollte, wäre, dass die Addition korrekt ausgeführt wird (keine Subtraktion usw.). Ich werde ein Modul dafür schreiben.

test_tashizan.py



import unittest
from tashizan import tashizan


class TestTashizan(unittest.TestCase):
    """test class of tashizan.py
    """

    def test_tashizan(self):
        """test method for tashizan
        """
        value1 = 2
        value2 = 6
        expected = 8
        actual = tashizan(value1, value2)
        self.assertEqual(expected, actual)


if __name__ == "__main__":
    unittest.main()

Wenn Sie unittest.main () drücken, wird eine Gruppe von Tests ausgeführt. Das Ergebnis ist wie folgt.

$ python test_tashizan.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Wenn unittest.main () ausgeführt wird, werden alle Klassen erkannt, die unittest.TestCase im Zielskript erben, und alle Methoden mit Namen, die mit test beginnen, werden als Testfälle ausgeführt.

Führen Sie nur bestimmte Testmethoden aus

Wenn es mehrere Tests gibt, führen Sie sie mit der oben beschriebenen Methode aus und sie werden sofort ausgeführt. Das Ergebnis des Hinzufügens einer Subtraktion zur vorherigen und ihrer Ausführung ist wie folgt

keisan.py


def tashizan(a, b):
    """calculate a+b

    :param a: value 1(int)
    :param b: value 2(inte)
    :return: a + b
    """
    return a + b


def hikizan(a, b):
    """calculate a - b

    :param a:  value 1(int)
    :param b:  value 2(int)
    :return:  a - b
    """
    return a - b

--−−−

test_keisan.py


import unittest
import keisan


class TestKeisan(unittest.TestCase):
    """test class of keisan.py
    """

    def test_tashizan(self):
        """test method for tashizan
        """
        value1 = 2
        value2 = 6
        expected = 8
        actual = keisan.tashizan(value1, value2)
        self.assertEqual(expected, actual)


class TestKeisan2(unittest.TestCase):
    def test_hikizan(self):
        """test method for hikizan
        """
        value1 = 2
        value2 = 12
        expected = -10
        actual = keisan.hikizan(value1, value2)
        self.assertEqual(expected, actual)


if __name__ == "__main__":
    unittest.main()

$ python test_keisan.py -v
test_tashizan (__main__.TestKeisan)
test method for tashizan ... ok
test_hikizan (__main__.TestKeisan2)
test method for hikizan ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

(Beliebig getrennte Klassen. Im obigen Fall schreiben Sie wahrscheinlich in einer Klasse.) Es gibt jedoch Situationen, in denen Sie nur eine bestimmte Testklasse ausführen möchten. Verwenden Sie in diesem Fall zur Laufzeit die Option -m. Ein Beispiel ist unten gezeigt. Hier werden durch Hinzufügen der Option -v nach unittest Informationen zum Testinhalt angezeigt. Wenn Sie Python -m -v ... ausführen, wird die Option -v an den Python-Interpreter übergeben, sodass viele Informationen angezeigt werden, die nichts mit dem Test zu tun haben. (Siehe @ skawagt's Kommentar)

$ python  -m unittest test_keisan.TestKeisan2 -v
.
test_hikizan (test_keisan.TestKeisan2)
test method for hikizan ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Fassen Sie die Verarbeitung vor und nach der Ausführung des Testfalls zusammen

Das Initialisieren des Werts kann zeitaufwändig sein. Wenn Sie verschiedene Vorgänge für ein bestimmtes Objekt überprüfen möchten, ist es schwierig, für jeden Testfall einen Wert einzugeben. In diesem Fall gibt es die Methoden setUp und tearDown. SetUp und TearDown werden für jeden Testfall ausgeführt.

Hier ist ein Beispiel dafür, wann Sie eine Klasse quadratischer Gleichungen haben und diese testen möchten.

QuadraticEquation.py


import numpy as np


class QuadraticEquation(object):
    """Quadratic equation class
    """

    def __init__(self):
        self.a = 1.0
        self.b = 2.0
        self.c = 1.0

    def calc_root(self):
        """calculate root

        :return: root1, root2 (root1 < root2)
        """
        x1 = (-1.0 * self.b - np.sqrt(self.b * self.b - 4.0 * self.a * self.c)) / (2.0 * self.a)
        x2 = (-1.0 * self.b + np.sqrt(self.b * self.b - 4.0 * self.a * self.c)) / (2.0 * self.a)
        return x1, x2

    def calc_value(self, x):
        """ calculate polynomial value

        :param x: x
        :return: a * x^2 + b * x + c
        """

        return self.a * np.power(x, 2.0) + self.b * x + self.c

Der Testfall hierfür ist wie folgt.

test_quadraticEquation.py


import unittest
import QuadraticEquation
from unittest import TestCase


class TestQuadraticEquation(unittest.TestCase):
    def setUp(self):
        print "setup"
        self.eq = QuadraticEquation.QuadraticEquation()

    def test_calc_root(self):
        """ test method of s"""
        expected = (-1.0, -1.0)
        actual = self.eq.calc_root()

        self.assertEqual(expected, actual)
        self.assertEqual((0.0, 0.0), (self.eq.calc_value(actual[0]), self.eq.calc_value(actual[1])))

    def test_calc_value(self):
        """ test method of calc_value() """
        expected = (4.0, 9.0)
        actual = (self.eq.calc_value(1.0), self.eq.calc_value(2.0))

        self.assertEqual(expected, actual)

    def tearDown(self):
        print "tearDown"
        del self.eq


if __name__ == '__main__':
    unittest.main()

Wenn dies ausgeführt wird, ist ersichtlich, dass die Methoden setUp und tearDown zu Beginn und am Ende des Testfalls aufgerufen werden, wie unten gezeigt.

$ python -m unittest test_quadraticEquation
setup
tearDown
.setup
tearDown
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

Führen Sie eine Gruppe von Tests gleichzeitig durch

In Wirklichkeit denke ich, dass dies der Fall ist, wenn es mehrere Module gibt, die Sie explizit erstellen und Unit-Tests testen müssen. In diesem Fall können Sie nicht viele Testmodule einfach von Hand treffen.

In diesem Fall können Sie die Discovery-Funktion von unittest verwenden.

$ python -m unittest discover

Angesichts der beiden oben genannten Testfälle

$ ls
QuadraticEquation.py  keisan.py  test_keisan.py  test_quadraticEquation.py

Mit der obigen Entdeckung sieht es so aus: Alle Tests wurden durchgeführt.

$ python -m unittest discover
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK

Abdeckung messen

[Unvollendet]

Möglicherweise möchten Sie die Testabdeckungsrate messen, dies ist jedoch wahrscheinlich kein Merkmal von unittest. Damit Verwenden Sie die Abdeckung.

$ pip install coverage

Sie können dies verwenden, um die Abdeckung eines bestimmten Moduls zu messen oder es in eine HTML-Datei umzuwandeln ... Aber viel zu tun Sie müssen das Skript selbst schreiben.

Da es Nasentests gibt, ist es besser, sie zu verwenden (Werfen)

Liste der Asset-Methoden

Auszug aus dem Beamten. Fast gleich ist auch nützlich für den Vergleich von Floats. Dies ist nicht alles, bitte beziehen Sie sich auf die Formel.

ASSER-Methodentyp Ziel überprüfen
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)
assertAlmostEqual(a, b) round(a-b, 7) == 0
assertNotAlmostEqual(a, b) round(a-b, 7) != 0
assertGreater(a, b) -a > b
assertGreaterEqual(a, b) a >= b
assertLess(a, b) a < b
assertLessEqual(a, b) a <= b
assertRegexpMatches(s, r) r.search(s)
assertNotRegexpMatches(s, r) not r.search(s)
assertDictContainsSubset(a, b) all the key/value pairs in a exist in b

Zusammenfassung

  1. Importieren Sie unittest und schreiben Sie einen Testfall in eine Klasse, die unittest.TestCase erbt ――Zur Zeit mit einer Methode wie AssetHOGEHOGE
  2. Führen Sie den Test aus, indem Sie auf unittest.main () klicken. Verwenden Sie entdecken, wenn Sie verschiedene Module gleichzeitig testen möchten

references Unten finden Sie Referenzen und Websites.

Recommended Posts

Hinweise zur Verwendung des Python-Standards unittest
Verwendungshinweise für Python Decorator
python * args, ** kwargs Verwendungshinweise
Python-Scraping-Memo
Python lernen note_000
Python-Lernnotizen
concurrent.futures Verwendungshinweise
Unittest in Python
Python-Anfängernotizen
Python lernen note_006
[Python] Standardeingabe
Python C ++ Notizen
Python lernen note_005
Python-Grammatiknotizen
Python Library Hinweis
Python persönliche Notizen
Python Pandas Memo
Python lernen note_001
Python-Lernnotizen
Installationshinweise zu Python3.4
fehlende Ganzzahlen Python persönliche Notizen
Hinweise zur Entwicklung von Python-Paketen
Python unittest assertXXX Liste
Verwendung von Python-Einheimischen ()
Python-IP-Adresse Paket Memo
Notizen im Python Pickle-Format
Erstes Python-Memo
Matlab => Python-Migrationsnotizen
Hinweise zur Python3-Zuweisung
Hinweise zur Verwendung von Python-Unterprozessen
[Python] Informationen zur Standardeingabe
Python versuchen / außer Memo
Hinweise zur Python-Framework-Flasche
Verzeichnisstruktur beim Schreiben von Tests mit Python 3-Standard unittest
Python-Memo mit perl-ternärem Operator
O'Reilly python3 Primer Lernnotiz
Python 3.4 oder höher Standard Pip
[Python3] Standardeingabe [Cheet Sheet]
Python-Notizen, die Sie bald vergessen sollten
Python-Notizen zur Verwendung von Perl-Spezialvariablen
Python-Theorie regulärer Ausdruck Anmerkungen
Python Tkinter Memo (für mich)
Bequeme Hinweise zur Verwendung von Diff-Befehlen
Python3-Standardeingabe (Competition Pro)
Standardeingabe / Zusammenfassung / Python, Ruby
Empfangen von Standardeingabetipps @ python
[Python] Hinweise zur Datenanalyse
Transmutationsmatrix im Python-Standard
Lernnotizen zur Python-Datenanalyse
Hinweise zur Installation von Python auf Ihrem Mac
Beispiel für die Verwendung von Python Pickle
Unittest und CI in Python
Grundlegende Verwendung von Python-F-String
Holen Sie sich Evernote-Notizen in Python
[Python] Richtige Verwendung von Join
Python Standard virtuelle Umgebung venv
Hinweise zur Installation von Python unter CentOS
Python3-Standardeingabe für wettbewerbsfähige Programmierung