[PYTHON] Testgetriebene Entwicklung mit Django Teil 2

Testgetriebene Entwicklung mit Django Teil 2

Dies ist eine Lernnotiz zum Verständnis von Test Driven Development (TDD) in Django.

Referenzen sind [** Testgetriebene Entwicklung mit Python: Befolgen Sie die Testziege: Verwenden von Django, Selen und JavaScript (englische Ausgabe) 2. Ausgabe **](https://www.amazon.co.jp/dp/B074HXXXLS Wir werden mit dem Lernen basierend auf / ref = dp-kindle-redirect? _ Encoding = UTF8 & btkr = 1) fortfahren.

In diesem Buch führen wir Funktionstests mit der Django 1.1-Serie und FireFox durch. Dieses Mal werden wir jedoch Funktionstests mit der Djagno 3-Serie und Google Chrome durchführen. Ich habe auch einige persönliche Änderungen vorgenommen (z. B. das Ändern des Projektnamens in Config), aber es gibt keine wesentlichen Änderungen.

⇒⇒ Klicken Sie hier für Teil 1

Part1. The Basics of TDD and Django

Chapter2 Extending Our Functional Test Usinng the unittest Module

In Kapitel 1 können Sie den ersten Funktionstest aus der Umgebungskonstruktion von Django schreiben und prüfen, ob die Standardseite von Django den Funktionstest durchläuft. Es ist fertig. Dieses Mal möchte ich dies auf die eigentliche Startseite anwenden, während ich eine ToDo-Anwendung erstelle.

Das Testen mit dem Web-Treiber von Chrome und Selenium wird als ** Funktionstest ** bezeichnet, da Sie aus Sicht des Benutzers sehen können, ** wie Ihre Anwendung funktioniert **. Es verfolgt die * User Story *, wenn ein Benutzer eine Anwendung verwendet, und bestimmt, wie der Benutzer die Anwendung verwendet und wie die Anwendung darauf reagiert.

Functional Test == Acceptance Test == End-To-End Test

** Testgetriebene Entwicklung mit Python: Befolgen Sie die Testziege: Verwenden von Django, Selen und JavaScript (englische Ausgabe) 2. Ausgabe ** In / B074HXXXLS / ref = dp-kindle-redirect? _ Encoding = UTF8 & btkr = 1) wird das Testen der Funktion (* Funktion *) einer Anwendung als * Funktionstests * bezeichnet. In diesem Artikel wird es daher als Funktionstest bezeichnet. Ich werde. Dies wird auch als * Abnahmetests *, * End-to-End-Tests (E2E-Tests, Integrationstests) * bezeichnet. Mit diesem Test soll untersucht werden, wie die gesamte Anwendung von außen funktioniert.

Schreiben wir es nun als Kommentar in den Funktionstest, während wir die tatsächliche User Story annehmen.

# django-tdd/functional_tests.py

from selenium import webdriver

browser = webdriver.Chrome()

#Nobita ist neu in-Ich habe gehört, dass es eine Do-App gibt und habe auf die Homepage zugegriffen.
browser.get('http://localhost:8000')

#Nobita hat den Seitentitel und den Header zu-Ich habe bestätigt, dass es sich um eine Do-App handelt.
assert 'To-Do' in browser.title

#Nobita ist zu-Aufforderung zum Ausfüllen des Do-Elements,


#Nobita schrieb in das Textfeld "Buy Dorayaki"(Sein bester Freund liebt Dorayaki)


#Wenn Nobita die Eingabetaste drückt, wird die Seite aktualisiert
# "1:Dorayaki kaufen"Ist zu-Es stellt sich heraus, dass es als Element zur Aufgabenliste hinzugefügt wurde


#Über das Textfeld können Sie weiterhin Elemente ausfüllen
#Ausgefüllt "Geld für Dorayaki aufladen"(Er ist eng, wenn es um Geld geht)


#Die Seite wurde erneut aktualisiert und ich konnte sehen, dass neue Elemente hinzugefügt wurden


#Nobita ist das zu-Ich habe mich gefragt, ob die do-App meine Artikel richtig aufzeichnet.
#Als ich die URL überprüfte, stellte ich fest, dass die URL eine bestimmte URL für Nobita zu sein scheint


#Als Nobita versuchte, auf eine bestimmte URL zuzugreifen, die er einmal bestätigt hatte,


#Ich war glücklich einzuschlafen, weil die Gegenstände gelagert wurden.


browser.quit()

Die Behauptung über den Titel wurde von "Django" in "To-Do" geändert. Es wird erwartet, dass der Funktionstest so wie er ist fehlschlägt. Führen wir also einen Funktionstest durch.

#Starten Sie den lokalen Server
$ python manage.py runserver

#Starten Sie eine andere Befehlszeile
#Funktionstest ausführen
$ python functional_tests.py

Traceback (most recent call last):
  File "functional_tests.py", line 11, in <module>
    assert 'To-Do' in browser.title
AssertionError

Der Test ist wie erwartet fehlgeschlagen. Daher wissen wir, dass wir mit der Entwicklung fortfahren sollten, damit dieser Test erfolgreich sein kann.

Verwenden Sie unittest Module

Im Funktionstest sind wir gerade gelaufen

--AssertioError ist nicht nett (ich hoffe du weißt was der Browsertitel wirklich war)

Es gab Ärger. Diese können mit dem unittest-Modul gelöst werden, bei dem es sich um ein Standard-Python-Modul handelt.

Schreiben wir den Funktionstest wie folgt um.

# django-tdd/functional_tests.py

from selenium import webdriver
import unittest


class NewVisitorTest(unittest.TestCase):

    def setUp(self):
        self.browser = webdriver.Chrome()

    def tearDown(self):
        self.browser.quit()

    def test_can_start_a_list_and_retrieve_it_later(self):
        #Nobita ist neu in-Ich habe gehört, dass es eine Do-App gibt und habe auf die Homepage zugegriffen.
        self.browser.get('http://localhost:8000')

        #Nobita hat den Seitentitel und den Header zu-Ich habe bestätigt, dass es sich um eine Do-App handelt.
        self.assertIn('To-Do', self.browser.title)
        self.fail('Finish the test!')

        #Nobita ist zu-Aufforderung zum Ausfüllen des Do-Elements,

        #Nobita schrieb in das Textfeld "Buy Dorayaki"(Sein bester Freund liebt Dorayaki)

        #Wenn Nobita die Eingabetaste drückt, wird die Seite aktualisiert
        # "1:Dorayaki kaufen"Ist zu-Es stellt sich heraus, dass es als Element zur Aufgabenliste hinzugefügt wurde

        #Über das Textfeld können Sie weiterhin Elemente ausfüllen
        #Ausgefüllt "Geld für Dorayaki aufladen"(Er hat wenig Geld)

        #Die Seite wurde erneut aktualisiert und ich konnte sehen, dass neue Elemente hinzugefügt wurden

        #Nobita ist das zu-Ich habe mich gefragt, ob die do-App meine Artikel richtig aufzeichnet.
        #Als ich die URL überprüfte, stellte ich fest, dass die URL eine bestimmte URL für Nobita zu sein scheint

        #Als Nobita versuchte, auf eine bestimmte URL zuzugreifen, die er einmal bestätigt hatte,

        #Ich war glücklich einzuschlafen, weil die Gegenstände gelagert wurden.


if __name__ == '__main__':
    unittest.main(warnings='ignore')

Funktionstests können durch Erben von unittest.TestCase geschrieben werden. Lassen Sie uns diesmal die Punkte klären.

Lass es uns laufen.

$ python functional_tests.py
======================================================================
FAIL: test_can_start_a_list_and_retrieve_it_later (__main__.NewVisitorTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "functional_tests.py", line 20, in test_can_start_a_list_and_retrieve_it_later
    self.assertIn('To-Do', self.browser.title)
AssertionError: 'To-Do' not found in 'Django:Web-Framework für Perfektionisten, die nie eine Frist verpassen'

----------------------------------------------------------------------
Ran 1 test in 7.956s

FAILED (failures=1)

Das unittest-Modul erleichtert das Verständnis des Inhalts von * AssertionError *.

Wenn Sie * self.assertIn ('To-Do', self.brower.title) * in * self.assertIn ('Django', self.brower.title) * ändern, sollten Sie in der Lage sein, den Test zu löschen. Lassen Sie uns dies überprüfen.

# django-tdd/functional_tests.py
# ~~Kürzung~~
    def test_can_start_a_list_and_retrieve_it_later(self):
        #Nobita ist neu in-Ich habe gehört, dass es eine Do-App gibt und habe auf die Homepage zugegriffen.
        self.browser.get('http://localhost:8000')

        #Nobita hat den Seitentitel und den Header zu-Ich habe bestätigt, dass es sich um eine Do-App handelt.
        self.assertIn('Django', self.browser.title)  #Veränderung
        self.fail('Finish the test!')
# ~~Kürzung~~
$ python functinal_tests.py
======================================================================
FAIL: test_can_start_a_list_and_retrieve_it_later (__main__.NewVisitorTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "functional_tests.py", line 21, in test_can_start_a_list_and_retrieve_it_later
    self.fail('Finish the test!')
AssertionError: Finish the test!

----------------------------------------------------------------------
Ran 1 test in 6.081s

FAILED (failures=1)

Als Ergebnis des Laufens sollte der Test erfolgreich sein, aber der Test ist FAIL. Als ich * AssertionError * aktiviert habe, wurde die von * self.fail ('Test beenden') * gesetzte Nachricht wiedergegeben. Dies liegt daran, dass * self.fail ('message') * die Funktion hat, die eingestellte Fehlermeldung immer auszuspucken, auch wenn kein Fehler vorliegt. Hier wird es als Erinnerung festgelegt, um Sie darüber zu informieren, dass der Test beendet ist.

Lassen Sie uns nun * self.fail ('Beende den Test!') * Auskommentieren und ausführen.

# django-tdd/functional_tests.py
# ~~Kürzung~~
    def test_can_start_a_list_and_retrieve_it_later(self):
        #Nobita ist neu in-Ich habe gehört, dass es eine Do-App gibt und habe auf die Homepage zugegriffen.
        self.browser.get('http://localhost:8000')

        #Nobita hat den Seitentitel und den Header zu-Ich habe bestätigt, dass es sich um eine Do-App handelt.
        self.assertIn('Django', self.browser.title)
        # self.fail('Finish the test!')  #Auskommentieren
# ~~Kürzung~~
$ python functinal_tests.py

.
----------------------------------------------------------------------
Ran 1 test in 7.698s

OK

Es wurde bestätigt, dass der Test fehlerfrei erfolgreich war. Die endgültige Ausgabe des Funktionstests sollte folgendermaßen aussehen. Lassen Sie uns die Änderungen in * function_tests.py * rückgängig machen.

# django-tdd/functional_tests.py
# ~~Kürzung~~
    def test_can_start_a_list_and_retrieve_it_later(self):
        #Nobita ist neu in-Ich habe gehört, dass es eine Do-App gibt und habe auf die Homepage zugegriffen.
        self.browser.get('http://localhost:8000')

        #Nobita hat den Seitentitel und den Header zu-Ich habe bestätigt, dass es sich um eine Do-App handelt.
        self.assertIn('To-do', self.browser.title)
        self.fail('Finish the test!')
# ~~Kürzung~~

Commit

Durch das Erstellen von User Stories beim Hinzufügen von Kommentaren konnte ich Funktionstests für Aufgabenanwendungen erstellen und ausführen. Lassen Sie uns hier festlegen. Ich konnte die geänderte Datei mit ** git status ** bestätigen.

Sie können den Unterschied zum letzten Commit überprüfen, indem Sie ** git diff ** ausführen. Wenn Sie dies tun, können Sie sehen, dass sich function_tests.py erheblich geändert hat.

Lassen Sie uns begehen.

$ git add .
$ git commit -m "First FT specced out in comments, and now users unittest"

Kapitel 2 Zusammenfassung

Wir konnten die Funktionstests von der Ebene der Bestätigung des Starts eines Django-Projekts auf eine Ebene ändern, die auf einer User Story basiert, die eine To-Do-Anwendung verwendet. Wir haben auch festgestellt, dass die Verwendung von unittest Fehlermeldungen besser nutzen kann.

Recommended Posts

Testgetriebene Entwicklung mit Django Teil 3
Testgetriebene Entwicklung mit Django Teil 4
Testgetriebene Entwicklung mit Django Teil 6
Testgetriebene Entwicklung mit Django Teil 2
Testgetriebene Entwicklung mit Django Teil 1
Testgetriebene Entwicklung mit Django Teil 5
Testgetriebenes Entwicklungsstart mit PySide & Pytest
Entwicklungsverdauung mit Django
[Test Driven Development (TDD)] Kapitel 21 Zusammenfassung
App-Entwicklung mit SQLite mit Django (PTVS)
Erleben Sie Teil I "Multinationale Währung" des Buches "Test Driven Development" mit Python
Internationalisierung mit Django
Django startete Teil 4
CRUD mit Django
Erste Django-Entwicklung
Erstellen Sie solche Testdaten mit Python (Teil 1)
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
Django Erste Schritte Teil 2 mit dem Eclipse Plugin (PyDev)
Erstellen Sie mit der Doker Toolbox eine Django-Entwicklungsumgebung
Authentifizieren Sie Google mit Django
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Laden Sie Dateien mit Django hoch
PDF mit Django ausgeben
Mit Codetest stärken ⑨
Markdown-Ausgabe mit Django
Verwenden Sie Gentelella mit Django
Mit Codetest stärken ⑤
Mit Codetest stärken ④
Erste Schritte mit Django 1
Primzahlbeurteilung mit Python
Mail mit Django senden
Sandkasten mit neo4j Teil 10
Webanwendung erstellt mit Python3.4 + Django (Teil.1 Umgebungskonstruktion)
Datei-Upload mit Django
Mit Codetest stärken ②
Verwenden Sie WENIGER mit Django
Pooling mechanisieren mit Django
Verwenden Sie MySQL mit Django
Mit Codetest stärken ①
Erstellen Sie eine Entwicklungsumgebung mit Poetry Django Docker Pycharm
[Memo] Django-Entwicklungsumgebung
Artikel, die die Systementwicklung mit Django (Python) ermöglichen _Einführung
Django ab heute
Erste Schritte mit Django 2
Mit Codetest stärken ⑧
Mit Codetest stärken ⑨
Tutorial für die testgetriebene Entwicklung (TDD) mit Flask-2-Dekorateuren
Erstellen Sie mit Docker eine Django-Entwicklungsumgebung! (Docker-compose / Django / postgreSQL / nginx)
[Django] Erstellen Sie mit PyCharm schnell eine Entwicklungsumgebung für Django-Container (Docker)
Erstellen Sie mit Django eine Bulletin-Board-App von Grund auf neu. (Teil 2)
Erstellen Sie mit Django eine Bulletin-Board-App von Grund auf neu. (Teil 3)
Tutorial für die testgetriebene Entwicklung (TDD) mit Flask-1 Test Client Edition
Bildverarbeitung mit Python (Teil 2)
Python mit freeCodeCamp Teil1 studieren
Mach Django mit CodeStar (Python3.6.8, Django2.2.9)