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