2017-06-23 1 views
0

Ich schreibe Tests für eine Post-API, die die Ressource zurückgibt, die erstellt wird. Aber wie gehe ich diese Daten an eine Halterung in Python so kann es Bereinigung nach dem Test abgeschlossen istpytest Daten für die Bereinigung übergeben

Cleanup:

@pytest.fixture(scope='function') 
def delete_after_post(request): 
    def cleanup(): 
     // Get ID of resource to cleanup 
     // Call Delete api with ID to delete the resource 
    request.addfinalizer(cleanup) 

Test:

def test_post(delete_after_post): 
    Id = post(api) 
    assert Id 

Was ist der beste Weg zu passieren die Antwort (ID) zurück an die Fixture, damit die Bereinigung ausgeführt wird. Sie möchten die Bereinigung nicht als Teil des Tests durchführen.

+0

Warum nicht pro-Methode Setup/Teardown verwenden? ID im Setup speichern und im Teardown aufräumen. – phd

+0

ID wird von der zu testenden API generiert und ist nicht im Voraus bekannt. –

Antwort

0

Sie können auf diese ID mithilfe der Anforderungsinstanz zugreifen und überall in Ihrem Code durch request.instance.variableName verwenden. Wie, Angenommen, Ihre Methode für delete(resource_id) id löschen, hier

conftest.py

import pytest 

@pytest.fixture(scope='function') 
def delete_after_post(request): 
    def cleanup(): 
     print request.node.resourceId 
     # Get ID of resource using request.instance.resourceId 
     # Call Delete api with ID to delete the resource 

    request.addfinalizer(cleanup) 

Testdatei xyz_test.py

def test_post(delete_after_post,request): 
    request.node.resourceId='3' 
+0

so Anfrage enthält den Kontext für den Testlauf. Dies klingt eine gute Möglichkeit, die Aufgabe zu erledigen. –

+0

Nein. Sieht so aus, als ob es "Anfrage" im Test nicht zu erkennen scheint '> request.instance.resourceId = 3 E AttributError: 'NoneType' Objekt hat kein Attribut 'resourceId'' –

+0

Ich habe die Antwort aktualisiert. Was mir ganz gut geht. –

0

Die Art, wie ich eine Klasse erstellen tat, war genannt TestRunContext und setzen Sie statische Variablen, um Daten zu übergeben.

Datei: test_run_context.py

class TestRunContext: 
     id_under_test = 0 

Datei: conftest.py

@pytest.fixture(scope='function') 
def delete_after_post(): 
    print('hello') 

    yield 

    url = 'http://127.0.0.1:5000/api/centres/{0}'.format(TestRunContext.id_under_test) 
    resp = requests.delete(url) 

Datei: test_post.py

def test_creates_post(delete_after_post): post_data ={ 'name' : 'test', 'address1': 'test', 'city': 'test', 'postcode': 'test', } url = 'http://127.0.0.1:5000/api/centres' data = requests.post(url, post_data) TestRunContext.id_under_test = data.id assert data

Das jetzt für mich arbeitet. Aber in der Hoffnung, eine bessere Lösung zu finden als die ContextManager-Datei. Wirklich mag diese Lösung nicht.

+0

Dies ist nicht die beste Antwort. Die obige Antwort von Chanda Korat ist die bessere bisher. –

Verwandte Themen