Wie teste ich LoginForm, wenn ich versuche, es mit Django zu testen ... Wie teste ich es mit einem Pseudonym ...? Ich habe einen Test gemacht, während ich nachgedacht habe, also werde ich eine Notiz als Memorandum hinterlassen.
Ausführung | |
---|---|
python | 3.7.4 |
Django | 2.2.5 |
Der Test verwendet den Django-Standard (heißt er "unittest"?).
Überlegen Sie zuerst, was Sie testen möchten. Abschließend habe ich beschlossen, Folgendes zu testen:
Dies sind die oben genannten drei. Ich werde unten auflisten, worüber ich nachgedacht habe, aber ich werde auch erwähnen, warum ich es nicht getestet habe.
Was möchten Sie testen? | Warum nicht testen? |
---|---|
Formularvalidierung(Nicht verwendbare Zeichen)prüfen | Alles was Sie brauchen ist, wenn Sie sich als Benutzer registrieren(Wenn Sie sich nicht registrieren können, können Sie sich nicht anmelden) |
Überprüfen Sie, ob Sie sich anmelden konnten | Scheint es nicht so, als könnten Sie Ihr Login nicht testen, weil Sie ein CSRF-Token haben? |
client.Login-Prüfung mit Login | Ich benutze kein Formular, daher denke ich nicht, dass es notwendig ist |
Das ist es. Wenn ich es zurücklese, habe ich das Gefühl, dass LoginForm und LoginView durcheinander sind. Da LoginView jedoch nur LoginForm verwendet, ist es meines Erachtens nur erforderlich, Formulare zu testen.
Die diesmal zu testenden Formulare und der verwendete Ansichtscode.
Views.py
from django.contrib.auth.views import LoginView
from ..forms import LoginForm
class Login(LoginView):
form_class = LoginForm
template_name = 'account_management/login.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) #Rufen Sie zuerst die geerbte Methode auf
context["username"] = self.request.user.username
return context
Views.py
from django.contrib.auth.forms import AuthenticationForm
class LoginForm(AuthenticationForm):
"""Login Formular"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs['class'] = 'form-control'
field.widget.attrs['placeholder'] = field.label #Setzen Sie die Feldbezeichnung in den Platzhalter
Schreiben wir nun den Testcode für die obigen Formulare.
Test wird in tests.py
beschrieben. (Wenn Sie das Verzeichnis geändert haben, lesen Sie es bitte entsprechend.)
Klassennamen und Methodennamen müssen mit test
beginnen.
Der Code ist unten.
Views.py
from django.test import TestCase
from django.contrib.auth.models import User
from ..forms import LoginForm
class Test_LoginForm(TestCase):
def setUp(self):
User.objects.create_user(username='test_account', email='[email protected]', password='test_pass')
def test_LoginForm_name_error(self):
form_data = {
'username': 'error',
'password': 'test_pass'
}
form = LoginForm(data=form_data)
self.assertFalse(form.is_valid(), 'Es gab keinen korrekten Fehler mit dem Benutzernamen.')
def test_LoginForm_pass_error(self):
form_data = {
'username': 'test_account',
'password': 'error'
}
form = LoginForm(data=form_data)
self.assertFalse(form.is_valid(), 'Das Passwort gab keinen korrekten Fehler aus.')
def test_LoginForm_true(self):
form_data = {
'username': 'test_account',
'password': 'test_pass'
}
form = LoginForm(data=form_data)
self.assertTrue(form.is_valid(), 'Das Formular hat nicht richtig funktioniert.')
Werfen wir einen Blick in die Klasse.
setUp
wird unmittelbar vor der Ausführung der Methode in der Klasse ausgeführt.
Djangos Tests erstellen die Datenbank für jeden Test neu, sodass Sie den Benutzer jedes Mal definieren müssen.
Dieses Mal definiere ich den Benutzer in "setUp".
Als nächstes folgt jede Testmethode. Es gibt keinen großen Unterschied zwischen den drei, also werde ich sie zusammen erklären.
In LoginForm können Sie Ihren Benutzernamen und Ihr Passwort eingeben. Wenn diese korrekt sind, können Sie sich anmelden.
In form_data
wird im Wörterbuchtyp beschrieben, was an welches Feld übergeben wird.
Übergeben Sie dann die Daten an LoginForm.
Wenn der übergebene Wert mit dem registrierten Paar aus Benutzername und Kennwort korrekt ist (da es sich diesmal um eine Anmeldung handelt), gibt form.is_valid ()
True zurück. Andernfalls wird "False" zurückgegeben.
Dieses Mal sollen die beiden oben genannten Methoden einen Fehler zurückgeben, dh sie erwarten False.
self.assertFalse (form.is_valid (), 'Das Passwort hat keinen korrekten Fehler ausgegeben.')
Ist geschrieben. Wenn Sie "True" erwarten, wird es "assertTrue" sein.
Die Argumente für "assertFalse" sind der "auszuwertende Wert" und die "Anzeige im Fehlerfall".
Wenn Sie dies tun,
$ python manage.py test account_management/tests -k
Using existing test database for alias 'default'...
System check identified no issues (0 silenced).
...
----------------------------------------------------------------------
Ran 4 tests in 3.196s
OK
Preserving test database for alias 'default'...
Sie können sehen, dass der Test so bestanden wurde.
Der Befehl -k
ist eine Option, die die im Test erstellte Datenbank nicht löscht, sondern auch die nächste verwendet.
Ich wollte die Datenbank nach der Ausführung überprüfen, also habe ich sie angehängt und ausgeführt.
Ich weiß nicht, ob es passt, aber ich konnte vorerst einen Test schreiben. Aus irgendeinem Grund habe ich einen Tag gebraucht, um dahin zu gelangen. Ich hoffe, dass Sie so nachfolgende Tests reibungslos erstellen können ...
Recommended Posts