Viktigt
Översättning är en gemenskapsinsats du kan gå med i. Den här sidan är för närvarande översatt till 100.00%.
3. Skriva kod i PyQGIS Cookbook
Om du planerar att lägga till eller uppdatera några kapitel i PyQGIS-utvecklarens kokbok, bör du följa vissa regler för att möjliggöra automatisk testning av kodsnuttarna.
Testning är mycket viktigt eftersom det möjliggör automatisk kontroll av koden. Kodsnuttar med fel eller kod som använder föråldrade metoder kommer att misslyckas och meddelandet hjälper dig att åtgärda problemen.
För testning använder vi tillägget Sphinx doctest extension. Se dokumentationen för tillägget för mer detaljerad information.
3.1. Så här skriver du testbara kodsnuttar
Att skriva testbara kodsnuttar skiljer sig inte så mycket från den gamla metoden. I grund och botten måste du använda ett annat Sphinx-direktiv.
3.1.1. Doctest sfinx direktiv
Istället för att bädda in koden i ett .. code-block:: python
-direktiv (vilket skulle markera kodsyntaxen automatiskt), måste du nu bädda in den i en .. testcode::
. Det vill säga, istället för detta:
.. code-block:: python
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
Du använder nu detta:
.. testcode::
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
När du har skrivit exempelkoden bör du lägga till någon assertion som utvärderar koden och som körs automatiskt.
I exemplet ovan skapar du en crs och med assert crs.isValid()
testar du om den är giltig. Om koden har en felaktig python-syntax eller om crs.isValid()
returnerar False
, kommer detta kodavsnitt att misslyckas under testningen.
För att kunna köra testerna på kodavsnitten måste du importera alla klasser och deklarera alla variabler som används i kodavsnitten. Du kan inkludera dessa i själva kodavsnittet (synligt på HTML-sidorna) eller lägga till dem i ett ...testsetup::
-direktiv (dolt på HTML-sidorna). ... testsetup::
måste placeras före ... testcode::
:
.. testsetup::
from qgis.core import QgsCoordinateReferenceSystem
.. testcode::
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
Om kodavsnittet inte skapar objekt (och du därför inte kan använda något som assert object.isValid()
) kan du testa koden med hjälp av print()
-metoden och sedan lägga till de förväntade resultaten i ett .. testoutput::
-direktiv för att jämföra den förväntade utmatningen:
.. testcode::
print("QGIS CRS ID:", crs.srsid())
print("PostGIS SRID:", crs.postgisSrid())
.. testoutput::
QGIS CRS ID: 3452
PostGIS SRID: 4326
Som standard visas innehållet i .. testoutput::
i HTML-utmatningen. Om du vill dölja det från HTML använder du alternativet :hide::
.. testoutput::
:hide:
QGIS CRS ID: 3452
PostGIS SRID: 4326
Observera
Om kodavsnittet innehåller några utskriftssatser MÅSTE du lägga till en testoutput
med de förväntade utdata; annars kommer testet att misslyckas.
3.1.2. Gruppering av tester
För varje första dokument testas kodsnuttarna sekventiellt, vilket innebär att du kan använda en .. testsetup::
för alla följande kodsnuttar och att senare snuttar kommer att ha tillgång till variabler som deklarerats i tidigare i dokumentet.
Alternativt kan du använda grupper för att dela upp exemplen på samma sida i olika tester.
Du lägger till kodsnutten i grupper genom att lägga till ett eller flera gruppnamn (åtskilda med kommatecken) i respektive direktiv:
.. testcode:: crs_crsfromID [, morenames]
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
doctest
kommer att välja varje grupp utdrag och köra dem oberoende av varandra.
Observera
Använd gruppnamn som är logiska i förhållande till det relaterade innehållet. Använd något som liknar <chapter>_<subchapter>, till exempel: crs_intro, crs_fromwkt. I händelse av fel hjälper detta till att identifiera var felen inträffar.
Om du inte anger någon grupp kommer kodavsnittet att läggas till i en grupp med namnet default
. Om du istället använder *
som gruppnamn kommer kodavsnittet att användas i alla testgrupper, något som normalt är användbart i testuppsättningen:
.. testsetup:: *
from qgis.core import QgsCoordinateReferenceSystem
3.2. Så här testar du snippets på din lokala maskin
Observera
Anvisningarna gäller för Linux-system.
För att testa Python-kodsnuttar behöver du en QGIS-installation. För detta finns det många alternativ. Det kan du göra:
Använd din system QGIS-installation med Sphinx från en virtuell Python-miljö:
make -f venv.mk doctest
Använd en manuellt byggd installation av QGIS. Du skulle behöva:
Skapa ett eget
Makefile
-tillägg ovanpå filenvenv.mk
, till exempel en filuser.mk
med följande innehåll:# Root installation folder QGIS_PREFIX_PATH = /home/user/apps/qgis-master include venv.mk
Eller
# build output folder QGIS_PREFIX_PATH = /home/user/dev/QGIS-build-master/output include venv.mk
Använd den sedan för att köra målet
doctest
:make -f user.mk doctest
Kör målet
doctest
inuti den officiella QGIS dockeravbildningen:make -f docker.mk doctest
Du måste installera Docker först eftersom det här använder en dockeravbildning med QGIS i den.