Важно
Перевод - это работа сообщества : ссылка:Вы можете присоединиться. Эта страница в настоящее время переводится |прогресс перевода|.
3. Написание кода в поваренной книге PyQGIS
Если вы планируете добавить или обновить некоторые главы PyQGIS- Разработчик- Книга рецептов, то вам следует соблюдать некоторые правила, чтобы обеспечить автоматическое тестирование фрагментов кода.
Тестирование очень важно, потому что оно позволяет автоматически проверять код. Фрагменты кода с ошибками или код, использующий устаревшие методы, не будут работать, и уведомление поможет вам устранить проблемы.
Для тестирования мы используем расширение Sphinx doctest. За более подробной информацией обращайтесь к документации по расширению.
3.1. Как писать тестируемые фрагменты кода
Написание тестируемых фрагментов кода не так уж сильно отличается от старого метода. По сути, вам нужно использовать другую директиву Sphinx.
3.1.1. Директивы Doctest sphinx
Вместо того чтобы вставлять код в директиву . кодовый блок:: python
(которая автоматически выделит синтаксис кода), теперь вам нужно вставить его в . тестовый код::
. То есть вместо this:
.. code-block:: python
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
Теперь вы используете это:
.. testcode::
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
После того как вы написали код примера, необходимо добавить ассерцию, которая будет оценивать код и выполняться автоматически.
В приведенном выше примере вы создаете crs и с помощью assert crs.isValid()
проверяете**, является ли он действительным. Если код имеет неправильный синтаксис python или crs.isValid()
возвращает False
, этот фрагмент кода будет неудачным при тестировании.
Для успешного выполнения тестов на сниппетах необходимо импортировать все классы и объявить все переменные, используемые в сниппетах кода. Вы можете включить их в сам сниппет кода (видимый на HTML-страницах) или добавить их в директиву . testsetup::
(скрытую на HTML-страницах). Директива . testsetup::
должна быть размещена перед директивой . testcode::
:
.. testsetup::
from qgis.core import QgsCoordinateReferenceSystem
.. testcode::
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
Если фрагмент кода не создает объекты (и поэтому вы не можете использовать что-то вроде assert object.isValid()
), вы можете протестировать код с помощью метода print()
, а затем добавить ожидаемые результаты в директиву . testoutput::
для сравнения ожидаемого вывода:
.. testcode::
print("QGIS CRS ID:", crs.srsid())
print("PostGIS SRID:", crs.postgisSrid())
.. testoutput::
QGIS CRS ID: 3452
PostGIS SRID: 4326
По умолчанию содержимое ...testoutput::
отображается в HTML-выводе. Чтобы скрыть его из HTML, используйте опцию :hide::
.. testoutput::
:hide:
QGIS CRS ID: 3452
PostGIS SRID: 4326
Примечание
Если фрагмент кода содержит какие-либо операторы печати, вы ДОЛЖНЫ добавить testoutput
с ожидаемыми результатами, иначе тест будет провален.
3.1.2. Группировка тестов
Для каждого первого документа фрагменты кода тестируются последовательно, что означает, что вы можете использовать один ...testsetup::
для всех последующих фрагментов кода и что последующие фрагменты будут иметь доступ к переменным, объявленным в предыдущих фрагментах документа.
Кроме того, можно использовать группы, чтобы разбить примеры на одной странице на разные тесты.
Вы добавляете фрагмент кода в группы, добавляя одно или несколько имен групп (через запятую) в соответствующей директиве:
.. testcode:: crs_crsfromID [, morenames]
crs = QgsCoordinateReferenceSystem("EPSG:4326")
assert crs.isValid()
Программа doctest
выберет каждую группу фрагментов и выполнит их независимо.
Примечание
Используйте названия групп, которые имеют смысл для связанного с ними контента. Используйте что-то похожее на <chapter>_<subchapter>, например: crs_intro, crs_fromwkt. В случае сбоев это поможет определить, где происходят сбои.
Если вы не объявите ни одной группы, фрагмент кода будет добавлен в группу с именем умолчанию
. Если вместо этого вы используете *
в качестве имени группы, сниппет будет использоваться во всех группах тестирования, что обычно полезно использовать при настройке тестов:
.. testsetup:: *
from qgis.core import QgsCoordinateReferenceSystem
3.2. Как тестировать сниппеты на локальной машине
Примечание
Инструкции действительны для системы Linux.
Для тестирования фрагментов кода Python необходима установка QGIS. Для этого существует множество вариантов. Вы можете:
Используйте вашу системную установку QGIS с Sphinx из виртуальной среды Python:
make -f venv.mk doctest
Используйте собранную вручную установку QGIS. Вам потребуется:
Создайте пользовательское расширение
Makefile
поверх файлаvenv.mk
, например, файлuser.mk
со следующим содержимым:# Root installation folder QGIS_PREFIX_PATH = /home/user/apps/qgis-master include venv.mk
Или
# build output folder QGIS_PREFIX_PATH = /home/user/dev/QGIS-build-master/output include venv.mk
Затем используйте его для запуска цели
doctest
:make -f user.mk doctest
Запустите цель
doctest
внутри официального докер-образа QGIS:make -f docker.mk doctest
Сначала необходимо установить Docker, потому что он использует образ docker с QGIS.