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

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren:

centron Managed Cloud Hosting in Deutschland

Wie berechnet man den BLEU-Score in Python?

Python
Wie berechnet man den BLEU-Score in Python? Der BLEU-Score in Python ist eine Metrik, die die Güte von maschinellen Übersetzungsmodellen misst. Ursprünglich wurde er nur für Übersetzungsmodelle entwickelt, wird jedoch…