テスト#

Matplotlib はpytestフレームワークを使用します。

テストは にlib/matplotlib/testsあり、pytest テスト インフラストラクチャのカスタマイズは にありmatplotlib.testingます。

要件#

テストを実行するには 、開発用に Matplotlib をセットアップする必要があります。特に、テスト用の追加の依存関係に注意してください。

ノート

開発セットアップでテストを実行することを前提としています。

インストールされている通常のバージョンの Matplotlib に対してテストを実行することはできますが、これはあまり一般的ではありません。テスト用に追加の依存関係が必要です 。ビルド済みの Matplotlib パッケージで配布されていないため、リポジトリから参照イメージを追加で取得する必要があります。

テストの実行#

開発リポジトリのルート ディレクトリで、次を実行します。

python -m pytest

pytest は、多くのコマンドライン パラメータを使用して構成できます。特に便利なものは次のとおりです。

-vまた--verbose

もっと冗長に

-n NUM

NUM 個のプロセスでテストを並行して実行する ( pytest-xdistが必要)

--capture=noまた-s

stdout をキャプチャしない

コマンド ラインから単一のテストを実行するには、ファイル パスを指定し、必要に応じて関数を 2 つのコロンで区切って指定します (テストはインストールする必要はありませんが、Matplotlib はインストールする必要があります)。

pytest lib/matplotlib/tests/test_simplification.py::test_clipping

簡単なテストを書く#

Matplotlib の多くの要素は、標準テストを使用してテストできます。たとえば、次のテストがありmatplotlib/tests/test_basic.pyます。

def test_simple():
    """
    very simple example test
    """
    assert 1 + 1 == 2

"test_"Pytest は、名前が で始まるファイルを検索し、それらのファイル内で で始まる関数 "test"または で始まるクラスを検索することにより、どの関数がテストであるかを判断します"Test"

一部のテストには、実行後にクリーンアップする必要がある内部的な副作用があります (図の作成や変更などrcParams)。pytest フィクスチャ matplotlib.testing.conftest.mpl_test_settingsはこれらを自動的にクリーンアップします。これ以上何もする必要はありません。

テストのランダムデータ#

ランダム データは、サンプル用のデータを生成するのに非常に便利な方法ですが、テストではランダム性が問題になります (テストは決定論的でなければならないためです!)。これを回避するには、各テストでシードを設定します。numpy のデフォルトの乱数ジェネレーターを使用するには:

import numpy as np
rng = np.random.default_rng(19680801)

rng乱数を生成するときに使用します。

シードはジョン・ハンターの誕生日です。

画像比較テストの作成#

画像ベースのテストを作成することは、単純なテストよりもわずかに難しいだけです。image_comparison 主な考慮事項は、デコレーターで「ベースライン」または予想されるイメージを指定する必要があることです。たとえば、次のテストでは、単一のイメージが生成され、自動的にテストされます。

from matplotlib.testing.decorators import image_comparison
import matplotlib.pyplot as plt

@image_comparison(baseline_images=['line_dashes'], remove_text=True,
                  extensions=['png'])
def test_line_dashes():
    fig, ax = plt.subplots()
    ax.plot(range(10), linestyle=(0, (3, 3)), lw=5)

このテストを初めて実行するときは、比較するベースライン イメージがないため、テストは失敗します。出力イメージ (この場合は ) をソース ディレクトリ (この場合は ) のツリーresult_images/test_lines/test_line_dashes.pngの正しいサブディレクトリにコピーします。この新しいファイルをソース コード リビジョン管理下に置きます ( を使用)。テストを再実行すると、合格するはずです。baseline_imageslib/matplotlib/tests/baseline_images/test_linesgit add

ベースライン イメージは、Matplotlib リポジトリで多くのスペースを占有します。画像比較テストの代替アプローチは、 check_figures_equalデコレータを使用することです。これは、2 つのパラメーターを受け取る関数を装飾し、Figure2 つの異なる方法 (テスト済みの方法とベースライン方法) を使用して同じ画像を Figure に描画するために使用する必要があります。デコレータは図の設定を手配し、描画結果を収集して比較します。

それらの使用に関する追加情報については、image_comparisonおよび のドキュメントを参照してください。check_figures_equal

matplotlib.tests で新しいモジュールを作成する#

テスト対象の主要なモジュールごとにテストを分類しておくようにしています。たとえば、mathtext.pyモジュールに関連するテストは にありますtest_mathtext.py

CI に GitHub アクションを使用する#

GitHub Actionsは、「クラウド内」でホストされる CI システムです。

GitHub Actions は、GitHub リポジトリへの新しいコミットの通知を受け取り、これらの新しいコミットを確認したときにビルドまたはテストを実行するように構成されています。.github/workflowsプロジェクトをテストする方法を確認するために、YAML ファイルが検索されます。

GitHub アクションは、メインの Matplotlib GitHub リポジトリに対して既に有効になっています。たとえば、テスト ワークフローを参照してください。

YAML ワークフロー ファイルが含まれると、個人の Matplotlib フォークに対して GitHub アクションが自動的に有効になります。メインの Matplotlib リポジトリに対して送信されたプル リクエストはすべてテストされるため、通常、これらのワークフローを確認する必要はありません。テスト ワークフローはフォークされたリポジトリではスキップされますが、 GitHub Web インターフェイスから手動で実行をトリガーできます。

GitHub Actions の結果は、 https://github.com/your_GitHub_user_name/matplotlib/actionsで確認できます。例を次に示します。

tox の使用#

Toxは、Python の複数のバージョン (3.7、3.8 など) や異なる Python 実装 (CPython、PyPy、Jython など) を含む複数の Python 環境に対してテストを実行するためのツールです。システムの $PATH で利用可能です (システムのパッケージ マネージャー (apt-get、yum、Homebrew など) を使用してインストールすることを検討してください)。

tox を使用すると、プル リクエストを送信する前に、作業コピーでリグレッションが発生したかどうかを簡単に判断できます。使用方法は次のとおりです。

$ pip install tox
$ tox

環境のサブセットで tox を実行することもできます。

$ tox -e py38,py39

Tox はすべてを順次処理するため、複数の環境をテストするには時間がかかる場合があります。高速化するには、新しい並列化バージョンの tox を使用してみてくださいdetox。これを試してください:

$ pip install -U -i http://pypi.testrun.org detox
$ detox

Tox は、 というファイルを使用して構成されますtox.inipy33テストする新しい環境 (例: ) を追加する場合、または依存関係やテストの実行方法を微調整する場合は、このファイルを編集する必要があり ます。tox.iniファイルの詳細については、Tox Configuration Specificationを参照してください。

Matplotlib の古いバージョンのビルド#

どのコミットが特定のバグを導入したかを確認するためにa を実行する場合、(まれに) 非常に古いバージョンの Matplotlib をビルドする必要がある場合があります。次の制約を考慮する必要があります。git bisect

  • Matplotlib 1.3 (またはそれ以前) には numpy 1.8 (またはそれ以前) が必要です。

Matplotlib のリリース バージョンのテスト#

リリース済みバージョン (PyPI パッケージや conda パッケージなど) のインストールでテストを実行するには、追加のセットアップも必要です。

ノート

エンド ユーザーの場合、通常、Matplotlib のリリース バージョンでテストを実行する必要はありません。公式リリースは公開前にテストされています。

追加の依存関係をインストールする#

テスト用に追加の依存関係をインストールします。

参照画像を取得する#

多くのテストでは、プロット結果を参照イメージと比較します。参照イメージは、通常のパッケージ バージョン (pip wheel または conda パッケージ) の一部ではありません。参照画像を使用してテストを実行する場合は、テストする Matplotlib のバージョンに一致する参照画像を取得する必要があります。

これを行うには、 PyPImatplotlib-X.Y.Z.tar.gzから一致するソース ディストリビューションをダウンロードするか 、代わりに git リポジトリと. テストする matplotlib インストールのフォルダーにフォルダーを コピーします。正しいターゲット フォルダーは、次を使用して見つけることができます。git checkout vX.Y.Zlib/matplotlib/tests/baseline_imagesmatplotlib/tests

python -c "import matplotlib.tests; print(matplotlib.tests.__file__.rsplit('/', 1)[0])"

lib/mpl_toolkits/tests/baseline_images テストには、 の類似したコピーが必要ですmpl_toolkits

テストを実行する#

インストールしたバージョンの Matplotlib ですべてのテストを実行するには:

python -m pytest --pyargs matplotlib.tests

テスト検出範囲は、単一のテスト モジュールまたは単一の機能にまで絞り込むことができます。

python -m pytest --pyargs matplotlib.tests.test_simplification.py::test_clipping