Problem mit Django, pytest-selenium und pytest-bdd

Django, Flask, Bottle, WSGI, CGI…
Antworten
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

Hallo allerseits,

vielleicht ist ja hier jemand, der oder die schon einmal das selbe Problem hatte oder sich besonders gut mit dieser Materie auskennt.

Ich entwickle gerade eine Django-App. Diese teste ich mit `pytest` und `pytest-django`.
Nun möchte ich Selenium dazunehmen um Ende-zu-Ende zu testen und habe dafür `pytest-bdd` und `pytest-selenium` als Dependencies dazugenommen.

Folgendes Problem:
In meinem Test gibt es (wenig überraschend) given-steps. Dort werden Test-Daten auf der Datenbank erzeugt, was ich auch in späteren steps (when und then) sehen kann. Dazu habe ich diese Daten von der DB abgefragt und per print auf der Console ausgegeben.
Der Test ruft eine Webseite/View auf und auf der Webseite selbst sind die Daten leider nicht zu sehen. Daher habe ich in der View ebenfalls ein print eingebaut, welches die Daten aus der DB laden und anzeigen soll. In diesen Fall ist das Query leer.

Mein View-Code scheint also eine andere Datenbank zu nutzen, als mein Test-Code, denn im Test-Code sind die Daten immer auf der Datenbank zu finden, und im Django-Code nicht.
Daher habe ich an beiden Stellen bereits die `settings.DATABASES` ausgeben lassen, diese sind allerdings identisch.

Hat irgendwer eine Idee, woran das liegen kann?


Hier findet ihr den Quellcode: https://bitbucket.org/huscy/consents/sr ... templates/
Achtung: nicht der master-branch, falls ihr das auscheckt.
Die View befindet sich unter `huscy/consents/views.py` und es handelt sich um die `CreateConsentView`. In `get_context_data` gebe ich mir die Daten aus, welche ich erzeugen wollte und in `get` gebe ich die DB-settings aus.
Die Tests befinden sich unter `tests/test_viewsets.py` und die steps dazu in `test/viewsets/create_consent.feature`

Ich bin über jeden Hinweis dankbar :-)
liebe Grüße, Stefan
Benutzeravatar
noisefloor
User
Beiträge: 3867
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

keine direkte Antwort auf deine Fragen... aber du weißt, dass Django ein umfangreiches Testframework an Bord hat, was eben genau für Django Applikationen gemacht ist? Link: https://docs.djangoproject.com/en/4.1/topics/testing/

Gruß, noisefloor
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

Hallo noisefloor,

danke für deinen Hinweis.
Das Testframework von Django ist mir bekannt. Ich teste lieber mit pytest, weil ich es übersichtlicher finde. Es gibt auch einige weitere Gründe, die mich zu einem Wechsel bewegt haben, die heute aber vermutlich nicht mehr relevant sind, weil Djange die fehlenden Funktionalitäten mittlerweile selbst mitbringt.

Die Frage ist allerdings, ob es wirklich am Testframework pytest liegt, oder ob es nicht von anderer Stelle (Selenium oder die BDD Tests) liegt.
Aber ich kann mal versuchen, meinen Test mit Django-Boardmitteln zu implementieren und schauen, ob das Problem dort ebenfalls auftritt.
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

Hallo allerseits,

danke an alle, die mal nachgesehen haben, was das Problem sein könnte. Ich habe es nun endlich selbst rausbekommen. Lediglich fehlende 18 Zeichen, die mich einen Tag gekostet haben ^^

pytestmark = pytest.mark.django_db(transaction=True)

das `transaction=True` war in dem Fall das Fehlende Teil damit das Ganze funktioniert. Der live_server und die Tests laufen in unterschiedlichen Threads und nutzen daher nur oberflächlich betrachtet die selbe Datenbank. Unter der Haube tun sie es nicht. Mit `transaction=true` kann dieses Problem behoben werden.
Antworten