Python Unittest – Wesentliche Testtechniken
Heute werden wir über Python Unittest lernen und uns Python Unit Test Beispielprogramme ansehen.
Python Unittest
Das Python Unittest Modul wird verwendet, um eine Einheit des Quellcodes zu testen. Nehmen wir an, Sie müssen Ihr Projekt testen. Sie wissen, welche Art von Daten die Funktion zurückgeben wird. Nachdem Sie umfangreichen Code geschrieben haben, müssen Sie überprüfen, ob der Output korrekt ist oder nicht. Normalerweise drucken wir den Output aus und vergleichen ihn mit der Referenzausgabedatei oder überprüfen den Output manuell. Um diesen Aufwand zu reduzieren, hat Python das Unittest Modul eingeführt. Mit diesem Modul können Sie den Output der Funktion mit etwas einfachem Code überprüfen. In diesem Tutorial werden wir über die grundlegende Verwendung des Python Unittest Moduls sprechen und einige Python Unit Testfälle schreiben, um die Funktionen einer Klasse zu testen.
Python Unit Test Beispielquelle
Zuerst müssen wir etwas Code schreiben, um ihn zu testen. Wir werden eine Python-Klasse haben. Der Hauptzweck der Klasse ist es, den Namen einer Person zu speichern und abzurufen. Also 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 der Output des oben genannten Codes wird wie folgt aussehen.
$ python3.6 Person.py
User Abbas has been added with id 0
User associated with id 0 is Abbas
$
Struktur von Python Unittest
Lassen Sie uns nun lernen, wie man Code für Unit Tests schreibt. Ein einzelner Testfall wird erstellt, indem von unittest.TestCase abgeleitet wird. Indem wir geeignete Funktionen überschreiben oder hinzufügen, 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+Shift+F10 drücken, um das Unittest Modul auszuführen. Andernfalls können Sie die Befehlszeile verwenden, um dieses Modul auszuführen. Zum Beispiel haben wir die Datei für Unit-Testing als Basic_Test.py benannt. Der Befehl zum Ausführen von Python Unittest wäre also: $python3.6 -m unittest Basic_Test.Testing Wenn Sie den ausführlichen Output sehen möchten, wäre der Befehl: $python3.6 -m unittest -v Basic_Test.Testing
Python Unit Test Ergebnisse & Grundfunktionen
Dieses Unittest hat 3 mögliche Ergebnisse. Sie sind unten aufgeführt:
- OK: Wenn alle Testfälle bestanden sind, zeigt der Output OK an.
- Fehler: Wenn einer der Testfälle fehlschlägt und eine AssertionError-Ausnahme auslöst.
- Fehler: Wenn eine andere Ausnahme als die AssertionError-Ausnahme ausgelöst wird.
Es gibt mehrere Funktionen im Unittest-Modul. Sie sind unten aufgelistet.
Methode | Überprüft, dass |
---|---|
assertEqual(a,b) | a == b |
assertNotEqual(a,b) | a != b |
assertTrue(x) | bool(x) ist True |
assertFalse(x) | bool(x) ist False |
assertIs(a,b) | a ist b |
assertIsNot(a, b) | a ist nicht b |
assertIsNone(x) | x ist None |
assertIsNotNone(x) | x ist nicht None |
assertIn(a, b) | a in b |
assertNotIn(a, b) | a nicht in b |
assertIsInstance(a, b) | isinstance(a, b) |
assertNotIsInstance(a, b) | nicht isinstance(a, b) |
Python Unit Test Beispiel
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 ihn 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 ausführt, nicht in der Reihenfolge, in der sie definiert sind. Und da wir wollen, dass unser set_name Test zuerst ausgeführt wird, haben wir unsere Testfallfunktionen als test_0_set_name und test_1_get_name benannt.
Python Unit Test Beispieloutput
Unten können Sie den Output sehen, der von unserem Unit-Test-Programm produziert wurde.
$ 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 – Grundlagen des Modultests – Wesentliche Testtechniken