Wie parametrisiert man klassenbezogene Fixtures mit Eingaben und erwarteten Ausgaben?Python

Python-Programme
Guest
 Wie parametrisiert man klassenbezogene Fixtures mit Eingaben und erwarteten Ausgaben?

Post by Guest »

Ich schreibe Tests für meine Flask-Anwendungsendpunkte. Der erste Endpunkt nimmt eine mehrteilige Anfrage entgegen und speichert die bereitgestellten Dateien auf dem Server. Der zweite Endpunkt ruft die Metadaten der gespeicherten Dateien ab.
Ich möchte erweiterbare Tests für diese Endpunkte erstellen, weiß aber nicht, wie ich Fixtures und Parameter richtig anordnen soll. Gehen Sie davon aus, dass das Posten einer Datei ein teurer Vorgang ist, den ich nur einmal pro Klasse ausführen möchte. Hier ist ein vereinfachter Code für das, was ich erreichen möchte:

Code: Select all

@pytest.mark.parametrize(
("title", "content_type", "expected_label", "expected_media_type"),
[
("My Title", "text/plain; charset=UTF-8", "My Title", "text/plain"),
# remaining test parameters ...
]
)
class TestUploadFile:
@pytest.fixture(scope="class")
def input_file_id(self, app_client, title, content_type):
r = app_client.post(
"/upload", data={"file": (open("example.txt", "rb"), title, content_type}
)
return r.json["file"]. # response contains file id

@pytest.fixture(scope="class")
def file_resource(self, app_client, input_file_id):
return app_client.get(f"/files/{input_file_id}")

def test_file_exists(self, file_resource, expected_label, expected_media_type):
assert file_resource.status_code == 200

def test_file_has_label(self, file_resource, expected_label, expected_media_type):
assert file_resource.json["label"] == expected_title

def test_file_has_media_type(self, file_resource, expected_label, expected_media_type):
assert file_resource.json["mediaType"] == expected_media_type
Hier sind die Probleme und Fragen, die ich habe:
  • Tests zeigen ScopeMismatch: Sie haben versucht, auf das funktionsbezogene Fixture zuzugreifen input_file_id mit einem klassenbezogenen Anforderungsobjekt.. Anscheinend hat input_file_id einen Funktionsbereich, obwohl ich ihn auf Klasse gesetzt habe.
  • Ich kann die Bereiche ändern zu Funktion, aber ich möchte die Datei einmal pro Datensatz hochladen, nicht für jede Testfunktion.
  • Ich habe gehört, dass es eine gute Praxis ist, nur eine Behauptung pro zu haben Test, aber ist es in diesem Fall wahr?
  • Ich muss die Argumente „expected_label“ und „expected_media_type“ in Tests wiederholen, die sie nicht verwenden. Wie kann man das vermeiden?
Es gibt eine ähnliche Frage, die bereits mit Pytest beantwortet wurde: Kombinieren Sie die Parametrisierung auf Klassenebene mit klassenbezogenen Fixtures, aber ich konnte sie nicht auf meinen Fall anwenden , weil meine Parametrisierung auch erwartete Werte umfasst.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post