[PYTHON] [Django] Standard-Anmeldeformular testen [TDD]

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.

Umgebung

Ausführung
python 3.7.4
Django 2.2.5

Der Test verwendet den Django-Standard (heißt er "unittest"?).

Was zu testen

Ü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.

Code für Ansichten und Formulare

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

Testcode schreiben

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.

Zusammenfassung

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

[Django] Standard-Anmeldeformular testen [TDD]
Django-Test
[Django] So testen Sie Form [TDD]
Testen Sie die Standardausgabe mit Pytest
[Django] Ich wollte testen, wenn ich eine große Datei poste [TDD]
Testgetriebene Entwicklung mit Django Teil 4
Testgetriebene Entwicklung mit Django Teil 6
Testgetriebene Entwicklung mit Django Teil 2
[Test Driven Development (TDD)] Kapitel 21 Zusammenfassung
Testgetriebene Entwicklung mit Django Teil 1
Testgetriebene Entwicklung mit Django Teil 5