Ich möchte meine eigene Pytest-Vorrichtung erstellen, wo ich einfügen kann, was ich in der Setup- und Teardown-Phase tun soll.Wie erstelle ich meine eigene Pytest-Halterung?
Ich suche so etwas wie (in diesem Beispiel i erstelle eine Datei, die für den Test benötigt):
@pytest.fixture
def file(path, content):
def setup():
# check that file does NOT exist
if os.path.isfile(path):
raise Exception('file already exists')
# put contents in the file
with open(path, 'w') as file:
file.write(content)
def teardown():
os.remove(path)
und ich möchte in der Lage sein, es zu benutzen wie folgt aus:
def test_my_function(file):
file('/Users/Me/myapplication/info.txt', 'ham, eggs, orange juice')
assert my_function('info') == ['ham', 'eggs', 'orange juice']
Ich bin mir bewusst, es gibt bereits eine tempdir
Leuchte in Pytest, die ähnliche Funktionalität hat. Leider erstellt dieses Gerät nur Dateien irgendwo innerhalb des Verzeichnisses /tmp
, und ich brauche Dateien in meiner Anwendung.
Danke!
UPDATE: Ich bin ziemlich nah dran. Das Folgende funktioniert fast, aber es setzt die PATH-Variable global nicht auf das Fixture, wie ich es erwartet hatte. Ich frage mich, ob ich eine Klasse anstelle einer Funktion für mein Gerät erstellen kann.
@pytest.fixture
def file(request):
PATH = None
def setup(path, content):
PATH = path
# check that file does NOT exist
if os.path.isfile(PATH):
raise Exception('file already exists')
# put contents in the file
with open(PATH, 'w+') as file:
file.write(content)
def teardown():
os.remove(PATH)
request.addfinalizer(teardown)
return setup
ich nicht meine spezifische Lösung gemeinsam nutzen kann, aber es ist im Sinne dieser allgemeinen Idee, und es scheint gut zu funktionieren . Meine Version hat einen Stapel, der alle erstellten Dateien verfolgt und sie dann am Ende löscht. Ich entschied mich auch, das Send2Trash-Modul zu verwenden, so dass gelöschte Dateien in den Papierkorb meines Computers gelangen würden, anstatt sofort entfernt zu werden. Dies kann zur Fehlerbehebung hilfreich sein, wenn der Code fehlschlägt usw. – mareoraft