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:
- OK: Wenn alle Testfälle bestanden sind, zeigt die Ausgabe OK.
- Fehler: Wenn einer der Testfälle fehlgeschlagen ist und eine AssertionError-Ausnahme ausgelöst hat
- 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. :)



