Website-Suche

Python unittest - Beispiel für einen Unit-Test


Heute werden wir über Python Unittest lernen und uns Beispiele für Python Unit Tests ansehen. Im vorherigen Tutorial haben wir über die Python Zip-Funktion gelernt.

Python-unittest

Das Python-Unittest-Modul wird verwendet, um einen Teil des Quellcodes zu testen. Angenommen, Sie müssen Ihr Projekt testen. Sie wissen, welche Art von Daten die Funktion zurückgeben wird. Nach dem Schreiben eines umfangreichen Codes müssen Sie überprüfen, ob die Ausgabe korrekt ist oder nicht. Normalerweise drucken wir die Ausgabe aus und vergleichen sie mit der Referenz-Ausgabedatei oder überprüfen die Ausgabe manuell. Um diesen Aufwand zu reduzieren, hat Python das Unittest-Modul eingeführt. Mit diesem Modul können Sie die Ausgabe der Funktion mit einigen einfachen Codes überprüfen. In diesem Tutorial werden wir die grundlegende Verwendung des Python-Unittest-Moduls besprechen und einige Python-Unittest-Fälle schreiben, um die Funktionen einer Klasse zu testen.

Python Unit-Test-Beispielquelle

Zunächst müssen wir etwas Code schreiben, um sie unit zu testen. Wir werden eine Python-Klasse haben. Der Hauptzweck der Klasse ist es, den Namen einer Person zu speichern und abzurufen. Daher schreiben wir die Funktion set_name(), um die Daten zu speichern, und die Funktion get_name(), um den Namen aus der Klasse abzurufen.

class Person:
    name = []

    def set_name(self, user_name):
        self.name.append(user_name)
        return len(self.name) - 1

    def get_name(self, user_id):
        if user_id >= len(self.name):
            return 'There is no such user'
        else:
            return self.name[user_id]


if __name__ == '__main__':
    person = Person()
    print('User Abbas has been added with id ', person.set_name('Abbas'))
    print('User associated with id 0 is ', person.get_name(0))

Wir haben die Klassendatei als Person.py benannt. Und die Ausgabe des obigen Codes wird wie folgt aussehen.

python3.6 Person.py 
User Abbas has been added with id  0
User associated with id 0 is  Abbas
$

Python unittest Struktur

Jetzt lernen wir, wie man für Unit-Tests programmiert. Ein individueller Testfall wird erstellt, indem man von unittest.TestCase erbt. Durch das Überschreiben oder Hinzufügen geeigneter Funktionen können wir Logik zum Testen hinzufügen. Der folgende Code wird erfolgreich sein, wenn a gleich b ist.

import unittest


class Testing(unittest.TestCase):
    def test_string(self):
        a = 'some'
        b = 'some'
        self.assertEqual(a, b)

    def test_boolean(self):
        a = True
        b = True
        self.assertEqual(a, b)

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

Wie man das python unittest Modul ausführt

Wenn Sie die PyCharm IDE verwenden, können Sie einfach ctrl+shift+F10 drücken, um das unittest-Modul auszuführen. Andernfalls können Sie die Eingabeaufforderung verwenden, um dieses Modul auszuführen. Zum Beispiel haben wir die Datei für die Unit-Tests Basic_Test.py genannt. Der Befehl zur Ausführung des Python-Unittest wird sein: $python3.6 -m unittest Basic_Test.Testing Wenn Sie die ausführliche Ausgabe sehen möchten, lautet der Befehl: $python3.6 -m unittest -v Basic_Test.Testing Mit PyCharm erhalten wir die folgende Ausgabe.

Python Einheitstest-Ergebnisse & Grundlegende Funktionen

Dieser Unittest hat 3 mögliche Ergebnisse. Sie sind unten aufgeführt:

  1. OK: Wenn alle Testfälle bestanden sind, zeigt die Ausgabe OK.
  2. Fehler: Wenn einer der Testfälle fehlgeschlagen ist und eine AssertionError-Ausnahme ausgelöst hat
  3. Fehler: Wenn eine andere Ausnahme als die AssertionError-Ausnahme ausgelöst wird.

Es gibt mehrere Funktionen im unittest-Modul. Sie sind unten aufgeführt.

MethodeÜberprüft, ob
assertEqual(a,b)a==b
assertiereNichtGleich(a,b)a != b
assertTrue(x)bool(x) ist wahr
assertFalse(x)bool(x) ist False
assertIs(a,b)a ist b
assertIs(a,b)a ist b
assertIsNot(a, b)a ist nicht b
assertIsNone(x)x ist None
assertiereIstNichtNone(x)x ist nicht None
assertiereIn(a, b)a in b
assertNotIn(a, b)ein nicht in b
prüfeInstanz(a, b)isinstance(a, b)
assertNotIsInstance(a, b)nicht isinstance(a, b)

Beispiel für einen Python-Einheitstest

Jetzt ist es an der Zeit, Unit-Tests für unsere Quellklasse Person zu schreiben. In dieser Klasse haben wir zwei Funktionen implementiert - get_name() und set_name(). Jetzt werden wir diese Funktionen mit unittest testen. Daher haben wir zwei Testfälle für diese beiden Funktionen entworfen. Schauen Sie sich den folgenden Code an, Sie werden es leicht verstehen.

import unittest

This is the class we want to test. So, we need to import it
import Person as PersonClass


class Test(unittest.TestCase):
    """
    The basic class that inherits unittest.TestCase
    """
    person = PersonClass.Person()  # instantiate the Person Class
    user_id = []  # variable that stores obtained user_id
    user_name = []  # variable that stores person name

    # test case function to check the Person.set_name function
    def test_0_set_name(self):
        print("Start set_name test\n")
        """
        Any method which starts with ``test_`` will considered as a test case.
        """
        for i in range(4):
            # initialize a name
            name = 'name' + str(i)
            # store the name into the list variable
            self.user_name.append(name)
            # get the user id obtained from the function
            user_id = self.person.set_name(name)
            # check if the obtained user id is null or not
            self.assertIsNotNone(user_id)  # null user id will fail the test
            # store the user id to the list
            self.user_id.append(user_id)
        print("user_id length = ", len(self.user_id))
        print(self.user_id)
        print("user_name length = ", len(self.user_name))
        print(self.user_name)
        print("\nFinish set_name test\n")

    # test case function to check the Person.get_name function
    def test_1_get_name(self):
        print("\nStart get_name test\n")
        """
        Any method that starts with ``test_`` will be considered as a test case.
        """
        length = len(self.user_id)  # total number of stored user information
        print("user_id length = ", length)
        print("user_name length = ", len(self.user_name))
        for i in range(6):
            # if i not exceed total length then verify the returned name
            if i < length:
                # if the two name not matches it will fail the test case
                self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))
            else:
                print("Testing for get_name no user test")
                # if length exceeds then check the 'no such user' type message
                self.assertEqual('There is no such user', self.person.get_name(i))
        print("\nFinish get_name test\n")


if __name__ == '__main__':
    # begin the unittest.main()
    unittest.main()

Beachten Sie, dass das unittest-Modul die Testfunktionen in der Reihenfolge ihrer Namen und nicht in der Reihenfolge ihrer Definition ausführt. Und da wir möchten, dass unser Test set_name zuerst ausgeführt wird, haben wir unsere Testfallfunktionen als test_0_set_name und test_1_get_name benannt.

Python-Einheitstest-Beispielausgabe

Die untenstehenden Bilder zeigen die Ausgabe, die unser Unit-Testprogramm produziert hat - sowohl im normalen Modus als auch im ausführlichen Modus.

python3.6 -m unittest -v PersonTest.Test
test_0_set_name (PersonTest.Test) ... Start set_name test

user_id length =  4
[0, 1, 2, 3]
user_name length =  4
['name0', 'name1', 'name2', 'name3']

Finish set_name test

ok
test_1_get_name (PersonTest.Test) ... 
Start get_name test

user_id length =  4
user_name length =  4
Testing for get_name no user test
Testing for get_name no user test

Finish get_name test

ok

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

OK
$

Das ist alles über das Python-Unittest-Tutorial. Um mehr zu erfahren, lesen Sie die offizielle Dokumentation. Bei weiteren Fragen verwenden Sie bitte das Kommentarfeld. :)