\chapter{Démarrer un nouveau projet}


Django fonctionne sur un
\href{https://docs.djangoproject.com/en/dev/internals/release-process/}{roulement de trois versions mineures pour une version majeure}, clôturé par une version LTS (\emph{Long Term Support}).

\includegraphics{images/django-support-lts.png}

La version utilisée sera une bonne indication à prendre en considération pour nos dépendances, puisqu'en visant une version particulière, nous ne devrons pratiquement pas nous soucier (bon, un peu quand même, mais nous le verrons plus tard\ldots\hspace{0pt}) des dépendances à installer, pour peu que l'on reste sous un certain seuil.

Dans les étapes ci-dessous, nous épinglerons une version LTS afin de nous assurer une certaine sérénité d'esprit (= dont nous ne occuperons pas pendant les 3 prochaines années).


\section{Tests unitaires}

Chaque application est créée par défaut avec un fichier \textbf{tests.py}, qui inclut la classe \texttt{TestCase} depuis le package \texttt{django.test}:


On a deux choix ici: 

\begin{enumerate}
    \item Utiliser les librairies de test de Django
    \item Utiliser Pytest
\end{enumerate}

\subsection{django.test}

\begin{listing}[H]
    \begin{minted}{Python}
    from django.test import TestCase
        class TestModel(TestCase):
            def test_str(self):
                raise NotImplementedError('Not implemented yet')
    \end{minted}
\end{listing}

\subsection{Pytest}

\subsection{Couverture de code}

La couverture de code est une analyse qui donne un pourcentage lié à la quantité de code couvert par les tests. Il ne s'agit pas de vérifier que le code est bien testé, mais de vérifier quelle partie du code est testée. 
Le paquet coverage se charge d’évaluer le pourcentage de code couvert par les tests.
Avec pytest, il convient d’utiliser le paquet pytest-cov, suivi de la commande pytest
--cov=gwift tests/.
Si vous préférez rester avec le cadre de tests de Django, vous pouvez passer par le paquet django-coverage-plugin.
Ajoutez-le dans le fichier requirements/base.txt, et lancez une couverture de code grâce à la commande coverage. 
La configuration peut se faire dans un fichier .coveragerc que vous placerez à la racine de votre projet, et qui sera lu lors de l’exécution.


\begin{verbatim}
    # requirements/base.text
    [...]
    django_coverage_plugin
\end{verbatim}

\begin{verbatim}
    # .coveragerc to control coverage.py
    [run]
    branch = True
    omit = ../*migrations*
    plugins =
        django_coverage_plugin
    
    [report]
        ignore_errors = True
    
    [html]
    directory = coverage_html_report
\end{verbatim}

\begin{verbatim}
    $ coverage run --source "." manage.py test

    $ coverage report

        Name Stmts Miss Cover
        ---------------------------------------------
        gwift\gwift\__init__.py 0 0 100%
        gwift\gwift\settings.py 17 0 100%
        gwift\gwift\urls.py 5 5 0%
        gwift\gwift\wsgi.py 4 4 0%
        gwift\manage.py 6 0 100%
        gwift\wish\__init__.py 0 0 100%
        gwift\wish\admin.py 1 0 100%
        gwift\wish\models.py 49 16 67%
        gwift\wish\tests.py 1 1 0%
        gwift\wish\views.py 6 6 0%
        ---------------------------------------------
        TOTAL 89 32 64%
        ----
    $ coverage html

\end{verbatim}
