Stellen Sie sich vor, ich habe ein Dienstprogramm (vielleicht eine Klasse) namens Bar
in einem Modul foo
implementiert und die folgenden Tests dafür geschrieben.
test_foo.py:
%Vor%Stellen Sie sich nun vor, dass ich in Zukunft verschiedene Implementierungen der gleichen Schnittstelle schreiben werde. Ich möchte, dass diese Implementierungen in der Lage sind, die Tests zu verwenden, die für die obige Testsuite geschrieben wurden: Die einzigen Dinge, die geändert werden müssen, sind
Implementation
<test data set 1>
, <test data set 2>
etc. Ich suche also nach einer Möglichkeit, die obigen Tests wiederverwendbar zu schreiben, damit Autoren neuer Implementierungen der Schnittstelle in der Lage sind, die Tests zu verwenden, ohne die Implementierung und die Testdaten in sie einzufügen um die Datei zu ändern, die die ursprüngliche Spezifikation der Tests enthält.
Was wäre eine gute, idiomatische Art, dies im Pytest zu tun?
================================================== ======================
================================================== ======================
Hier ist eine unitest-Version, die (ist nicht schön aber) funktioniert.
define_tests.py:
%Vor%v1.py:
%Vor%v1_test.py:
%Vor%Jeder (auch ein Client der Bibliothek) schreibt eine andere Implementierung dieser Schnittstelle
define_tests.py
definierte Testmenge wiederverwenden
Dies ist ein großartiger Anwendungsfall für parametrisierte Testvorrichtungen .
Ihr Code könnte etwa so aussehen:
%Vor% Dies hätte test_one
zweimal ausgeführt: einmal wo Implementation = Bar und einmal Wo Implementation = Baz.
Beachten Sie, dass die Implementation nur ein Fixpunkt ist, Sie können ihren Bereich ändern oder mehr Einstellungen vornehmen (vielleicht die Klasse instanziieren, vielleicht irgendwie konfigurieren).
Wenn pytest mit dem pytest.mark.parametrize
Dekorator verwendet wird, werden alle Permutationen generiert. Angenommen, der Code oben und dieser Code hier:
test_two
wird vier Mal mit den folgenden Konfigurationen ausgeführt:
Sie können es nicht ohne Klassenvererbung machen, aber Sie müssen unittest.TestCase nicht verwenden. Um es pytest zu machen, können Sie Fixtures verwenden.
Damit können Sie beispielsweise die Geräteparametrierung vornehmen oder andere Fixes verwenden.
Ich versuche ein einfaches Beispiel zu erstellen.
%Vor%und zweiter Test schlägt fehl
%Vor% Vergessen Sie nicht, dass Sie python_class = *Test
in pytest.ini
Tags und Links python unit-testing py.test