3. PyQGISクックブック中でコードを書く

PyQGIS 開発者用 Cookbook の章を追加または更新することを計画している方は、コードスニペットの自動テストを可能にするためにいくつかの規則に従ってください。

テストはコードの自動チェックを可能にするので非常に重要です。 エラーのあるコードスニペットや古いメソッドを使用するコードは失敗し、その通知は問題の解決に役立ちます。

テストのために、 Sphinx doctest拡張機能 を使います。より詳細な情報については拡張機能のドキュメントを参照してください。

3.1. テスト可能なコードスニペットの書き方

テスト可能なコードスニペットを書くことは 古い 方法とそれほど変わりません。基本的には、異なるSphinxの ディレクティブ を使う必要があります。

3.1.1. sphinxディレクティブを文書化する

コードを .. code-block:: python ディレクティブに埋め込む代わりに(そうすると自動的にコード構文が強調表示される)、今度は .. testcode:: に埋め込む必要があります。つまり、これの代わりに:

.. 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

注釈

コードスニペットにprint文が含まれている場合は、期待される出力とともに testoutput を追加しなければなりません。そうでなければテストは失敗します。

3.1.2. テストをグループ化する

各rst 文書ごとに、コードスニペットは順番にテストされます。つまり、以下のすべてのコードスニペットに対して1つの .. testsetup:: を使用でき、後のスニペットでは文書内の前のスニペットで宣言された変数にアクセスできます。

あるいは、グループを使用して、異なるテスト中の同じページの例を分類することもできます。

それぞれのディレクティブに1つ以上のグループ名を(コンマで区切って)追加して、コードスニペットをグループに追加します:

.. testcode:: crs_crsfromID [, morenames]

   crs = QgsCoordinateReferenceSystem("EPSG:4326")
   assert crs.isValid()

doctest は各グループのスニペットを選び、それらを独立して実行します。

注釈

関連するコンテンツで意味のあるグループ名を使用してください。 <chapter>_<subchapter> のようなものを使用してください、例えばcrs_intro、crs_fromwkt。障害が発生した場合は、障害が発生した場所を特定するのに役立ちます。

グループを宣言しないと、コードスニペットは default という名前のグループに追加されます。 代わりに、グループ名として * を使用すると、スニペットはすべてのテストグループで使用されます。これは通常、テスト設定で使用すると便利です。

.. testsetup:: *

   from qgis.core import QgsCoordinateReferenceSystem

3.2. ローカルマシンでスニペットをテストする方法

注釈

Instructions are valid for Linux system.

To test Python code snippets, you need a QGIS installation. For this, there are many options. You can:

  • Use your system QGIS installation with Sphinx from a Python virtual environment:

    make -f venv.mk doctest
    
  • Use a manually built installation of QGIS. You'd need to:

    1. Create a custom Makefile extension on top of the venv.mk file, for example a user.mk file with the following content:

      # Root installation folder
      QGIS_PREFIX_PATH = /home/user/apps/qgis-master
      
      include venv.mk
      

      Or

      # build output folder
      QGIS_PREFIX_PATH = /home/user/dev/QGIS-build-master/output
      
      include venv.mk
      
    2. それから、それを使ってtarget doctest を実行します。

      make -f user.mk doctest
      
  • Run target doctest inside the official QGIS docker image:

    make -f docker.mk doctest
    

    You have to install Docker first because this uses a docker image with QGIS in it.