Heute lernen wir über Python-Unittest und schauen uns Beispiele für Python-Unittest-Programme an. Im vorherigen Tutorial haben wir uns die Python-Zip-Funktion angesehen.
Python Unittest
Das Python-Unittest-Modul wird verwendet, um eine Einheit des Quellcodes zu testen. Angenommen, Sie müssen Ihr Projekt testen. Sie wissen, welche Art von Daten die Funktion zurückgeben wird. Nachdem Sie großen Code geschrieben haben, müssen Sie überprüfen, ob die Ausgabe korrekt ist oder nicht. Normalerweise drucken wir die Ausgabe aus und vergleichen sie mit der Referenzausgabedatei 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 Codezeilen ü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 einige Codezeilen schreiben, um sie zu testen. Wir werden eine Python-Klasse erstellen. Der Hauptzweck der Klasse besteht darin, den Namen einer Person zu speichern und abzurufen. Dazu 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. Die Ausgabe des obigen Codes wird wie folgt sein:
$ python3.6 Person.py
User Abbas has been added with id 0
User associated with id 0 is Abbas
$
Python Unittest-Struktur
Nun lernen wir, wie wir den Code für die Unittests schreiben. Ein einzelner Testfall wird erstellt, indem unittest.TestCase
als Basisklasse verwendet wird. Durch das Überschreiben oder Hinzufügen entsprechender 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 Strg+Umschalt+F10 drücken, um das Unittest-Modul auszuführen. Andernfalls können Sie die Eingabeaufforderung verwenden, um dieses Modul auszuführen. Wenn wir beispielsweise die Datei für die Unittests als Basic_Test.py
benannt haben, lautet der Befehl zum Ausführen des Python-Unittests: $python3.6 -m unittest Basic_Test.Testing
Wenn Sie den ausführlichen Modus sehen möchten, lautet der Befehl: $python3.6 -m unittest -v Basic_Test.Testing
Wenn wir PyCharm verwenden, erhalten wir die folgende Ausgabe.
Python Unit Testergebnis & Grundlegende Funktionen
Dieser Unittest hat 3 mögliche Ergebnisse. Sie sind wie folgt aufgeführt:
- OK: Wenn alle Testfälle bestanden wurden, zeigt die Ausgabe OK an.
- Fehler: Wenn einer der Testfälle fehlgeschlagen ist und eine AssertionError-Ausnahme ausgelöst wurde.
- Fehler: Wenn eine andere Ausnahme als AssertionError ausgelöst wird.
Es gibt mehrere Funktionen im Unittest-Modul. Sie sind wie folgt aufgeführt.
Method | Checks that |
---|---|
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 |
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) |
Beispiel für Python Unittest
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 mithilfe von unittest
testen. Wir haben also zwei Testfälle für diese beiden Funktionen entworfen. Werfen Sie einen Blick auf den folgenden Code, dann werden Sie es leicht verstehen.
import unittest
# Dies ist die Klasse, die wir testen wollen. Wir müssen sie also importieren
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
# Testfallfunktion zur Überprüfung der Funktion Person.set_name
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):
# Einen Namen initialisieren
name = 'name' + str(i)
# Den Namen in der Variablen Liste speichern
self.user_name.append(name)
# Die vom Funktion erhaltenen Benutzer-ID abrufen
user_id = self.person.set_name(name)
# Überprüfen, ob die erhaltene Benutzer-ID null ist oder nicht
self.assertIsNotNone(user_id) # null user id will fail the test
# Die Benutzer-ID in der Liste speichern
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")
# Testfallfunktion zur Überprüfung der Funktion Person.get_name
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):
# Wenn i nicht die Gesamtlänge überschreitet, dann den zurückgegebenen Namen überprüfen
if i < length:
# Wenn die beiden Namen nicht übereinstimmen, wird der Testfall fehlschlagen
self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))
else:
print("Testing for get_name no user test")
# Wenn die Länge überschritten wird, dann die Meldung "Kein solcher Benutzer" überprüfen
self.assertEqual('There is no such user', self.person.get_name(i))
print("\nFinish get_name test\n")
if __name__ == '__main__':
# unittest.main() starten
unittest.main()
Beachten Sie, dass das Unittest-Modul die Testfunktionen in der Reihenfolge ihres Namens ausführt, nicht in der Reihenfolge, in der sie definiert sind. Und da wir unseren set_name-Test zuerst ausführen möchten, haben wir unsere Testfallfunktionen als test_0_set_name
und test_1_get_name
benannt.
Python Unit Test Beispiel Ausgabe
Unten sind Bilder der Ausgabe, die unser Unit-Test-Programm sowohl im normalen als auch im ausführlichen Modus produziert hat.
$ 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 nutzen Sie bitte das Kommentarfeld. 🙂
Source:
https://www.digitalocean.com/community/tutorials/python-unittest-unit-test-example