Πώς να δημιουργήσετε ένα έργο με το Django

Τώρα που γνωρίζουμε πώς να δημιουργούμε εικονικά περιβάλλοντα και να χρησιμοποιούμε pip, μπορούμε να αρχίσουμε να χτίζουμε το έργο μας. Σε αυτό το άρθρο, θα δημιουργήσουμε το πρώτο μας έργο Django, θα γράψουμε δοκιμές και θα ξεκινήσουμε τον διακομιστή ανάπτυξης.

Δημιουργία του εικονικού περιβάλλοντος

Αρχικά, ας δημιουργήσουμε ένα νέο εικονικό περιβάλλον για αυτό το έργο. (Εάν δεν το έχετε κάνει ήδη, απενεργοποιήστε το προηγούμενο virtualenv πληκτρολογώντας deactivateστο τερματικό). Για περισσότερες πληροφορίες σχετικά με εικονικά περιβάλλοντα και πώς να τα χρησιμοποιήσετε, επισκεφθείτε αυτήν τη σελίδα.

Μεταβείτε στον κατάλογο όπου θέλετε το έργο Django και πληκτρολογήστε τα ακόλουθα στο τερματικό:

mkvirtualenv taskplanner --python=/usr/bin/python3

Ίσως χρειαστεί να αλλάξετε τη διαδρομή Python εάν φαίνεται διαφορετική από την παραπάνω.

Το κέλυφος της γραμμής εντολών θα πρέπει τώρα να μοιάζει παρακάτω, υποδεικνύοντας ότι βρίσκεστε σε εικονικό περιβάλλον.

(taskplanner)[email protected] ~/workspace] $

Εάν δεν φαίνεται έτσι, απλώς πληκτρολογήστε:

workon taskplanner

Τώρα μπορούμε να εγκαταστήσουμε το Django:

pip install Django

Δημιουργήστε το Django Project μας

Με το Django εγκατεστημένο μπορούμε να δημιουργήσουμε το έργο μας:

django-admin.py startproject taskplanner

Στη συνέχεια, μεταβείτε στο νέο μας έργο πληκτρολογώντας:

cd taskplanner

Πριν κάνουμε κάτι, ας ορίσουμε αυτόν τον κατάλογο ως τον κατάλογο εργασίας μας χρησιμοποιώντας το virtualenvwrapper:

setvirtualenvproject

Sidenote : Για μια λίστα εντολών virtualenvwrapper, πληκτρολογήστεvirtualenvwrapperτο τερματικό σας.

Τώρα, όταν βρισκόμαστε στο εικονικό μας περιβάλλον, μπορούμε να πληκτρολογήσουμε cdprojectγια πλοήγηση κατευθείαν στον κατάλογο εργασίας μας.

Ο κατάλογος του έργου σας πρέπει να μοιάζει με αυτό:

taskplanner // our main working directory |--- manage.py // similar to the django-admin script, you will see this used a // lot throughout our project |--- taskplanner |--- __init__.py // this just tells python to treat this directory as a package |--- settings.py // main configuration file for our project |--- urls.py // we will use this to configure urls |--- wsgi.py // this is used for deploying our project to a production server

Λειτουργική δοκιμή

Η δοκιμαστική ανάπτυξη είναι μια ευρέως χρησιμοποιούμενη βέλτιστη πρακτική στην ανάπτυξη λογισμικού. Βασικά, θέλουμε να γράψουμε ένα τεστ πρώτα που είναι βέβαιο ότι θα αποτύχει και στη συνέχεια να γράψουμε τον ελάχιστο δυνατό αριθμό κώδικα για να περάσει αυτό το τεστ. Με το Django, στόχος μας είναι να γράψουμε τόσο λειτουργικές δοκιμές (επίσης γνωστές ως, δοκιμές ολοκλήρωσης, δοκιμές από άκρο σε άκρο κ.λπ.), όσο και δοκιμές μονάδας σε όλη την ανάπτυξη. Μην το ιδρώνεις, η δοκιμή δεν είναι τόσο δύσκολη όσο φαίνεται!

Αλλά πρώτα, πρέπει να δημιουργήσουμε ένα νέο εικονικό περιβάλλον αφιερωμένο στις δοκιμές. Ανοίξτε μια νέα καρτέλα στο τερματικό σας, μεταβείτε στον κατάλογο έργου του προγραμματιστή εργασίας σας και πληκτρολογήστε:

mkvirtualenv taskplanner_test --python=/usr/bin/python3

Τώρα θα πρέπει να έχετε ανοιχτές 2 καρτέλες στο τερματικό σας, μία στο εικονικό περιβάλλον (taskplanner) και η άλλη στο εικονικό περιβάλλον (taskplanner_test).

Εάν πληκτρολογήσετε pip freezeτο νέο περιβάλλον δοκιμών μας (taskplanner_test), θα παρατηρήσετε ότι δεν εμφανίζεται τίποτα. Αυτό συμβαίνει επειδή δεν έχουμε ακόμη εγκαταστήσει τίποτα στο νέο μας περιβάλλον.

Ας προχωρήσουμε λοιπόν και εγκαταστήστε πρώτα το Django στο περιβάλλον δοκιμών μας (taskplanner_test):

pip install Django

Για να δημιουργήσουμε τις λειτουργικές δοκιμές μας, θα χρειαστούμε μερικά πράγματα. Πρώτον, πρέπει να εγκαταστήσουμε το πρόγραμμα περιήγησης ιστού Firefox στο μηχάνημά μας. Εάν δεν έχετε Firefox, εγκαταστήστε το τώρα.

Sidenote : Μπορείτε να χρησιμοποιήσετε το Chrome για δοκιμές ενοποίησης, αλλά πρέπει να κατεβάσετε το πρόγραμμα οδήγησης εδώ και να ακολουθήσετε αυτήν την ερώτηση υπερχείλισης στοίβας. Ο Firefox είχε ιστορικά καλύτερη απόδοση από το chrome όταν εκτελούσε δοκιμές ενοποίησης, κάτι που είναι πολύ σημαντικό, καθώς σε σύγκριση με τις δοκιμές μονάδας, οι δοκιμές ενοποίησης είναι εξαιρετικά αργές.

Αυτό συμβαίνει επειδή οι δοκιμές ολοκλήρωσης δοκιμάζουν ολόκληρο το σύστημα και όχι «μονάδες» (μικρά εξαρτήματα). Στον πραγματικό κόσμο, μερικές φορές είναι καλύτερο να αποφύγετε τις δοκιμές ενσωμάτωσης λόγω του μεγάλου χρόνου ανάπτυξης για τη δημιουργία τους, του αργού χρόνου εκτέλεσης, των διφορούμενων λαθών και άλλων λόγων που θα ανακαλύψετε εγκαίρως.

Ωστόσο, αξίζουν να εξεταστούν κατά την ανάπτυξη μιας εφαρμογής πραγματικού κόσμου και μπορεί να είναι πολύ χρήσιμες από την άποψη της αξιοπιστίας παρά τα μειονεκτήματα της απόδοσης.

Στη συνέχεια, πρέπει να εγκαταστήσουμε ένα πακέτο που ονομάζεται Selenium. Αυτό το πακέτο θα μας παρέχει ένα WebDriver, ώστε να μπορούμε να ελέγξουμε ένα πρόγραμμα περιήγησης με τις δοκιμές μας. Το σελήνιο χρησιμοποιείται συνήθως για την αυτοματοποίηση του προγράμματος περιήγησής σας.

pip install selenium

Τώρα που το έχουμε εγκαταστήσει, θα χρειαστεί ένας κατάλογος για να δημιουργήσουμε τις δοκιμές μας:

mkdir functional_tests

Στον taskplannerκατάλογο θα πρέπει τώρα να δείτε τα εξής:

taskplanner |-- functional_tests |--- manage.py |--- taskplanner ...

Τώρα πρέπει να δημιουργήσουμε μερικά αρχεία στο functional_testsφάκελό μας . Θα δημιουργήσουμε ένα __init__.pyαρχείο (αυτό θα πει στον πύθωνα να συμπεριφέρεται functional_testsσαν πακέτο) και ένα test_all_users.pyαρχείο που θα περιέχει τις δοκιμές μας.

Ας το κάνουμε τώρα:

touch functional_tests/__init__.py touch functional_tests/test_all_users.py

Sidenote :__init__.pyείναι σχεδόν πάντα ένα κενό αρχείο. Για περισσότερες πληροφορίες σχετικά με το τι χρησιμοποιείται, δείτε αυτήν την απάντηση στο stackoverflow.

Μπορούμε επιτέλους να αρχίσουμε να γράφουμε το πρώτο μας λειτουργικό τεστ! Οι λειτουργικές δοκιμές είναι για τη δοκιμή κομματιών λειτουργικότητας στην εφαρμογή ιστού μας. Το TDD with Python περιγράφει λειτουργικές δοκιμές ως «πώς λειτουργεί η εφαρμογή από την άποψη του χρήστη».

So let’s open the test_all_users.py file in our text editor. First, we want to import selenium’s webdriver, and to make this a lot easier, Django provides something known as StaticLiveServerTestCase for live testing. Let’s import both of those now:

from selenium import webdriver from django.contrib.staticfiles.testing import StaticLiveServerTestCase

Since we are testing from the users perspective, let’s name these tests NewVisitorTest. Add the following:

class NewVisitorTest(StaticLiveServerTestCase): def setUp(self): self.browser = webdriver.Firefox() self.browser.implicitly_wait(2) def tearDown(self): self.browser.quit()

First, we create a StaticLiveServerTestCase class named NewVisitorTest, this will contain our tests that we want to run for a new visitor. Then, we have two methods named setUp and tearDown. The setUp method is initialized when we run our tests. So, for each test we run, we open Firefox and wait 2 seconds for the page to load. tearDown runs after each test is finished, this method closes the browser for us after each test.

Now we can write our first test, and have Firefox open and close automatically for us. Let’s write our test now below the tearDown method.

 def test_home_title(self): self.browser.get('//localhost:8000') self.assertIn('Welcome to Django', self.browser.title)

Our first test, how exciting! Let’s walk through it. Every test we want to create must start with ‘test’. For example, if I wanted to create a test for my css, I would call the method test_h2_css. So here, we named the test test_home_title. That’s pretty self-explanatory, which is exactly what we want for our tests. The method first brings Firefox to the url //localhost:8000, and then it checks if ‘Welcome to Django’ is in the html head tags title.

Let’s run this test now and see what happens:

python manage.py test functional_tests

First, what exactly are we typing here? The manage.py script provides us with something called ‘test’, we will use this to run all of our tests. Here we are running it on our functional_tests package that we created with the __init__.py file.

After running this you should see something like the following in your terminal:

F ====================================================================== FAIL: test_home_title (functional_tests.test_all_users.NewVisitorTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/username/url/to/project/taskplanner/functional_tests/test_all_users.py", line 15, in test_home_title self.assertIn('Welcome to Django', self.browser.title) AssertionError: 'Welcome to Django' not found in 'Problem loading page' ---------------------------------------------------------------------- Ran 1 test in 4.524s FAILED (failures=1)

So it failed, but it gave us some handy advice. First, the AssertionError. ‘Welcome to Django’ not found in ‘Problem loading page’. So that means the title of //localhost:8000 was ‘Problem loading page’. If you navigate to the url, you will see that the web page was not available.

Let’s try running our Django server to get the test to pass. Switch back to the terminal tab that is in the taskplanner virtual environment and run our server.

python manage.py runserver

You should see something like the following:

Performing system checks... System check identified no issues (0 silenced). You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them. March 06, 2016 - 20:53:38 Django version 1.9.4, using settings 'taskplanner.settings' Starting development server at //127.0.0.1:8000/ Quit the server with CONTROL-C.

Don’t worry about the unapplied migrations message yet.

Now that we have a server running on //localhost:8000, lets run our test again.

Go back to the other terminal tab that is in the taskplanner_test virtual environment and run the following once more:

python manage.py test functional_tests

You should see the following.

Creating test database for alias 'default'... . ---------------------------------------------------------------------- Ran 1 test in 4.033s OK Destroying test database for alias 'default'...

What We’ve Done So Far

Our first passing test!

We’ve covered a lot in this article. We created our first project, set up virtual environments for both development and testing purposes, wrote our first functional test, and followed the Test-driven development process by writing a failing test, and then making it making it pass.

Using starter templates

Μπορείτε να εξοικονομήσετε πολύ χρόνο ξεκινώντας το έργο σας με ένα πρότυπο εκκίνησης django. Αυτά τα έργα χρησιμοποιούν βέλτιστες πρακτικές που θα σας εξοικονομήσουν πονοκεφάλους αργότερα όταν το έργο σας μεγαλώσει. Μερικά από τα πιο δημοφιλή έργα είναι

  • Cookiecutter
  • Μίζα Hackathon
  • Ακρη