pytest: Wiederverwendbare Tests für verschiedene Implementierungen derselben Schnittstelle

9

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

  1. Der Import von Implementation
  2. <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

  • kann die in define_tests.py definierte Testmenge wiederverwenden
  • injizieren eigene Testdaten in die Tests
  • ohne Änderung der Originaldateien
jacg 08.10.2014, 21:08
quelle

2 Antworten

3

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:

%Vor%

test_two wird vier Mal mit den folgenden Konfigurationen ausgeführt:

  • Implementierung = Bar, Sache = 1
  • Implementierung = Bar, Sache = 2
  • Implementierung = Baz, Sache = 1
  • Implementierung = Baz, Sache = 2
Frank T 14.10.2014 20:57
quelle
0

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

definieren müssen     
Daniel Barton 23.09.2016 03:24
quelle

Tags und Links