Important
La traduction est le fruit d’un effort communautaire auquel vous pouvez vous joindre. Cette page est actuellement traduite à 100.00%.
3. Écriture de code dans le livre de recettes « PyQGIS Cookbook »
Si vous envisagez d’ajouter ou de mettre à jour certains chapitres du Développement PyQGIS - Livre de recettes, vous devez respecter certaines règles pour activer le test automatique des extraits de code.
Les tests sont vraiment importants car ils permettent un contrôle automatique du code. Les extraits de code avec des erreurs ou un code utilisant des méthodes obsolètes échoueront et la notification vous aidera à résoudre les problèmes.
Pour tester, nous utilisons l’extension Sphinx doctest. Reportez-vous à la documentation de l’extension pour plus d’informations.
3.1. Comment écrire des extraits de code testables
L’écriture d’extraits de code testables n’est pas si différente de l’ancienne méthode. En gros, vous devez utiliser une directive
Sphinx différente.
3.1.1. Directives sphinx de Doctest
Au lieu d’intégrer le code dans une directive .. code-block:: python
(qui mettrait automatiquement en évidence la syntaxe du code), vous devez maintenant l’intégrer dans un .. testcode::
. C’est à la place de ceci
.. code-block:: python
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
Vous utilisez maintenant ceci
.. testcode::
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
Après avoir écrit l’exemple de code, vous devez ajouter une assertion qui évaluera le code et sera exécutée automatiquement.
Dans l’exemple ci-dessus, vous créez un fichier crs et avec assert crs.isValid()
, vous testez s’il est valide. Si le code a une mauvaise syntaxe python ou si crs.isValid()
renvoie False
, cet extrait de code échouera pendant le test.
Pour réussir les tests sur les extraits, vous devez importer toutes les classes et déclarer toutes les variables utilisées dans les extraits de code. Vous pouvez les inclure dans l’extrait de code lui-même (visible dans les pages HTML) ou les ajouter à une directive .. testsetup::
(masquée dans les pages HTML). Le .. testsetup::
doit être placé avant le .. testcode::
.. testsetup::
from qgis.core import QgsCoordinateReferenceSystem
.. testcode::
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
Si l’extrait de code ne crée pas d’objets (et que vous ne pouvez donc pas utiliser quelque chose comme assert object.isValid()
), vous pouvez tester le code à l’aide de la méthode print()
, puis ajouter les résultats attendus dans une directive .. testoutput::
pour comparer la sortie attendue
.. testcode::
print("QGIS CRS ID:", crs.srsid())
print("PostGIS SRID:", crs.postgisSrid())
.. testoutput::
QGIS CRS ID: 3452
PostGIS SRID: 4326
Par défaut, le contenu de .. testoutput::
est affiché dans la sortie HTML. Pour le cacher du HTML, utilisez l’option :hide:
.. testoutput::
:hide:
QGIS CRS ID: 3452
PostGIS SRID: 4326
Note
Si l’extrait de code contient des instructions d’impression, vous DEVEZ ajouter un testoutput
avec les résultats attendus; sinon le test échouera.
3.1.2. Tests groupés
Pour chaque document « rst », les extraits de code sont testés séquentiellement, ce qui signifie que vous pouvez utiliser un .. testsetup::
pour tous les extraits de code suivants et que les extraits suivants auront accès aux variables déclarées dans les précédents.
Vous pouvez également utiliser des groupes pour décomposer les exemples de la même page dans différents tests.
Vous ajoutez l’extrait de code aux groupes en ajoutant un ou plusieurs noms de groupe (séparés par des virgules) dans la directive respective
.. testcode:: crs_crsfromID [, morenames]
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
doctest
va choisir chaque groupe de codes et les exécuter indépendamment.
Note
Utilisez des noms de groupe qui ont un sens avec le contenu associé. Utilisez quelque chose du type <chapter>_<subchapter>, par exemple: crs_intro, crs_fromwkt. En cas d’échec, cela aidera à identifier où les échecs se produisent.
Si vous ne déclarez aucun groupe, l’extrait de code sera ajouté à un groupe nommé default
. Si au lieu de cela, vous utilisez *
comme nom de groupe, l’extrait de code sera utilisé dans tous les groupes de test, ce qui est normalement utile dans la configuration de test
.. testsetup:: *
from qgis.core import QgsCoordinateReferenceSystem
3.2. Comment tester des extraits sur votre ordinateur local
Note
Les instructions sont valables pour le système Linux.
Pour tester les extraits de code Python, vous avez besoin d’une installation QGIS. Pour cela, il existe de nombreuses options. Vous pouvez :
Utilisez votre installation QGIS avec Sphinx à partir d’un environnement virtuel Python:
make -f venv.mk doctest
Utilisez une installation manuelle de QGIS. Vous aurez besoin de:
Créez une extension
Makefile
personnalisée en haut du fichiervenv.mk
, par exemple un fichieruser.mk
avec le contenu suivant:# Root installation folder QGIS_PREFIX_PATH = /home/user/apps/qgis-master include venv.mk
Ou
# build output folder QGIS_PREFIX_PATH = /home/user/dev/QGIS-build-master/output include venv.mk
Ensuite, utilisez-le pour lancer la cible
doctest
make -f user.mk doctest
Executez la cible
doctest
à l’intérieur de l’image officielle du docker QGIS:make -f docker.mk doctest
Vous devez d’abord installer Docker parce que cela utilise une image docker avec QGIS dedans.