Python-Unit-Tests: Schnellstart

Eine Übersetzung des Artikels wurde speziell für Studenten des Python QA Engineer- Kurses erstellt.


Unit-Code-Tests sind ein wesentlicher Bestandteil des Software-Entwicklungszyklus. Unit-Tests bilden auch die Grundlage für die Durchführung von Regressionstests, das heißt, sie stellen sicher, dass sich das System gemäß dem Szenario verhält, wenn neue Features hinzugefügt oder vorhandene geändert werden.

In diesem Artikel werde ich die Grundidee des Komponententests in einer Klasse demonstrieren. In der Praxis müssen Sie viele Testfälle schreiben, der Testsuite hinzufügen und alle zusammen ausführen. Die Verwaltung von Testfällen wird im nächsten Artikel behandelt.

Heute werden wir uns auf das Testen des Backends konzentrieren. Das heißt, der Entwickler hat ein Projekt gemäß den Spezifikationen implementiert (z. B. Calculator.py), und Sie müssen sicherstellen, dass der entwickelte Code wirklich mit ihnen übereinstimmt (z. B. mit TestCalculator.py ).

Angenommen, Sie haben die Calculator-Klasse geschrieben, um grundlegende Rechenfunktionen auszuführen: Addition, Subtraktion, Multiplikation und Division.

Der Code dafür ist hier ( Calculator.py ):

 #A simple calculator class Calculator: #empty constructor def __init__(self): pass #add method - given two numbers, return the addition def add(self, x1, x2): return x1 + x2 #multiply method - given two numbers, return the #multiplication of the two def multiply(self, x1, x2): return x1 * x2 #subtract method - given two numbers, return the value #of first value minus the second def subtract(self, x1, x2): return x1 - x2 #divide method - given two numbers, return the value #of first value divided by the second def divide(self, x1, x2): if x2 != 0: return x1/x2 

Jetzt möchte ich einen Komponententest durchführen, um zu verstehen, dass die Funktionalität in der obigen Klasse wie geplant funktioniert.

Python wird normalerweise mit dem unittest Paket unittest . Wenn es nicht auf Ihrem System vorhanden ist, installieren Sie es mit pip.

Der Komponententest hat folgenden Aufbau:



setUp() und tearDown() sind Standardmethoden, die mit dem unittest-Framework tearDown() werden (sie sind in der unittest.TestCase-Klasse definiert). Abhängig von Ihrem Testfall können Sie diese beiden Methoden standardmäßig außer Kraft setzen oder nicht.

Es ist Zeit, sich den Code des Testfalls anzusehen. Hier ist die Datei TestCalculator.py .

 import unittest from Calculator import Calculator #Test cases to test Calulator methods #You always create a child class derived from unittest.TestCase class TestCalculator(unittest.TestCase): #setUp method is overridden from the parent class TestCase def setUp(self): self.calculator = Calculator() #Each test method starts with the keyword test_ def test_add(self): self.assertEqual(self.calculator.add(4,7), 11) def test_subtract(self): self.assertEqual(self.calculator.subtract(10,5), 5) def test_multiply(self): self.assertEqual(self.calculator.multiply(3,7), 21) def test_divide(self): self.assertEqual(self.calculator.divide(10,2), 5) # Executing the tests in the above test case class if __name__ == "__main__": unittest.main() 

Das ist zwar nicht nötig, aber in der Regel rufe ich die Testklasse mit dem Präfix Test (in unserem Fall TestCalculator) auf. Eine Schlüsselanforderung in dieser Klasse ist das Vorhandensein der Superklasse unittest.TestCase .

Immer wenn dieser Testfall ausgeführt wird, wird zuerst die Methode setUp () ausgeführt. In unserem Fall erstellen wir einfach ein Objekt der Klasse Calculator und speichern es als Attribut der Klasse. In der übergeordneten Klasse gibt es mehrere andere Standardmethoden, die wir später erläutern werden.

Im test_xxx müssen Sie nur test_xxx Methoden schreiben, um jede Methode in der Calculator-Klasse zu testen. Bitte beachten Sie, dass alle Testmethoden mit dem Präfix test_ . Dies teilt Python unter Verwendung des unittest-Frameworks mit, dass dies Testmethoden sind.

Bei jeder Testmethode habe ich die integrierte assertEqual Methode verwendet, um zu überprüfen, ob die assertEqual den erwarteten Wert zurückgeben. Wenn der Rückgabewert dem erwarteten Wert entspricht, ist der Test erfolgreich, andernfalls schlägt er fehl.

Es gibt viele integrierte assert Methoden, über die wir später sprechen werden.

Die letzte Zeile im obigen Code startet nur den TestCalculator . Es führt jede in der Klasse definierte Testmethode aus und gibt das Ergebnis zurück.

 python TestCalculator.py -v 


Sie werden eine Schlussfolgerung ähnlich der folgenden sehen:

 test_add (__main__.TestCalculator) ... ok test_divide (__main__.TestCalculator) ... ok test_multiply (__main__.TestCalculator) ... ok test_subtract (__main__.TestCalculator) ... ok -------------------------------------------------------------------- Ran 4 tests in 0.000s OK 

Was ist, wenn etwas nicht wie erwartet funktioniert? Ändern wir den erwarteten Wert von test_divide von 5 auf 6 (5 ist der richtige Wert. Nun werden wir sehen, was passiert, wenn es fehlschlägt. Dies ist kein Fehler im Quellcode, sondern ein Fehler in der Testsuite. Möglicherweise haben Sie auch Fehler in den Testsuiten Testskripte auf Fehler prüfen!)

 import unittest from Calculator import Calculator #Test cases to test Calulator methods #You always create a child class derived from unittest.TestCase class class TestCalculator(unittest.TestCase): #setUp method overridden from the parent class TestCase def setUp(self): self.calculator = Calculator() ... def test_divide(self): self.assertEqual(self.calculator.divide(10,2), 6) # Executing the tests in the above test case class if __name__ == "__main__": unittest.main() 

Wenn Sie diesen Testfall ausführen, erhalten Sie das folgende Ergebnis:

 test_add (__main__.TestCalculator) ... ok test_divide (__main__.TestCalculator) ... FAIL test_multiply (__main__.TestCalculator) ... ok test_subtract (__main__.TestCalculator) ... ok ==================================================================== FAIL: test_divide (__main__.TestCalculator) -------------------------------------------------------------------- Traceback (most recent call last): File "TestCalculator.py", line 23, in test_divide self.assertEqual(self.calculator.divide(10,2), 6) AssertionError: 5.0 != 6 -------------------------------------------------------------------- Ran 4 tests in 0.001s FAILED (failures=1) 

Hier steht, dass 3 von 4 Tests erfolgreich waren, einer jedoch fehlgeschlagen ist. In einem realen Szenario wird davon ausgegangen, dass Ihr Testfall korrekt ist. Auf diese Weise können Sie eine Funktion identifizieren, die nicht ordnungsgemäß implementiert ist.

Source: https://habr.com/ru/post/de481806/


All Articles