テストガイド.

本節では,Astropyコアと協調パッケージでテストされたテストフレームワークとフォーマット基準を紹介し,付属パッケージとしての提案を行う.

テストフレームワーク

Asterpyが使用するテストフレーム(および使用 Astropy package template )はい。 pytest フレームワーク。

テスト依存項

Astropyテスト実行器が使用する依存項は,1つの名前からなる. pytest-astropy それがそうです。このパッケージは pytest 依存項自体はいくつかを除いて pytest Astropyが使用するプラグインは,他のパケットに対しても汎用的である.

Astropyの実装や使用は実際にはテスト依存項を必要としないため,それらは含まれていない. install_requires はい。 setup.cfg それがそうです。逆にそれらは extras_require 呼び出された部分 test はい。 setup.cfg それがそうです。テストキットを実行するための開発者は、pytest-Asterpyを直接インストールする必要があります::

pip install pytest-astropy

または“編集可能”モードでコアパッケージをインストールし、指定する [test] オプション::

pip install -e .[test]

これらのプラグインの詳細については、ご参照ください 最熱プラグイン 一節です。

運行テスト.

現在、Astropyテストを呼び出すための3つの異なる方法がある。すべてのメソッドが呼び出されます pytest テストを実行していますが、呼び出し時には異なるオプションを提供します。テストを実行するためには、持っていることを確認する必要があります pytest ソフトウェアパッケージをインストールしました。

Astropyテストを実行するほか、Pythonソースコードをチェックするために、これらのメソッドを呼び出すことができます。 PEP8 compliance それがそうです。PEP 8テストオプションはすべて必要です pytest-pep8 plugin 単独でインストールしなければなりません。

毒理.

テストを実行する最もロバストな方法は利用です Tox Pythonテストを自動化するための汎用ツールですTOXの利点の1つは,テストを実行する前に,まずテストするパケットのソースコード配布を作成し,新たな仮想環境にインストールすることと,パッケージに宣言された任意の依存項を実装することである.したがって、これは、宣言されていないパケットデータまたは失われた依存項に関連する問題を捕捉することができる。我々はTOXを用いて持続的な統合サービスに対して多くのテストを実行しているため,多くの場合これらのサービスで発生した問題を再現することができる.

TOXを使用してテストを実行するには、まずTOXがインストールされていることを確認してください。例えば、:

pip install tox

そして使用:基本テストキットの実行

tox -e test

または使用:オプションの依存項を持つすべてのテストキットを実行する

tox -e test-alldeps

以下のコマンドを使用して、利用可能なテスト環境のリストを表示することができます。

tox -l -v

これはまたそれぞれの役割を説明することができる。

例えば、テストに直接関連しないチェックまたはコマンドを実行することもできます。

tox -e codestyle

Flke 8ツールを用いてチェックを実行します。

Toxを実行する際にpytestにオプションを渡すことができますので、1つ追加してください -- 通常のtoxコマンドの後、このコマンドの後の任意の内容は、例えば、pytestに渡される。

tox -e test -- -v --pdb

それは -P 選択肢は pytest-filter-subpackage プラグインはテストキットの一部のみ実行されます。

一番火の

テストキットは当機からも直接ご利用いただけます pytest 命令は、通常、TOXを用いて反復開発を行うよりも速い。この場合,開発者は,以下の命令を実行することで任意の拡張を手動で再生成しなければならないことを認識しなければならないことが重要である.

pip install -e .[test]

Pytestテストは、以下の命令を使用して実行される前に:

pytest

電話をかけるのではなく pip install -e .[test] また、以下のコマンドを使用して拡張を構築することができます。

python setup.py build_ext --inplace

これは、現在の環境でAsterpyの開発者バージョンをインストールすることも避けていますが、ご注意ください pip テストパッケージの一部が必要な場合は、このコマンドを使用する必要があります entry points インストール中です。

特定のサブパケットまたはサブパケットのセットのテストのみを実行することができる。たとえば,実行のみを行うためには wcs コマンドラインからのテスト:

pytest -P wcs

あるいは、実行するだけです wcs そして utils テスト:

pytest -P wcs,utils

コマンドラインから、例えば、テストする単一のディレクトリまたはファイルを指定することもできます。

pytest astropy/modeling

あるいは:

pytest astropy/wcs/tests/test_wcs.py

これは正しい .rst ファイルも:

pytest astropy/wcs/index.rst

Asterpy.test()

以下のコマンドを使用して、インストールされたAstropyバージョンからテストを実行することができます。

import astropy
astropy.test()

これは、Astropyのすべてのデフォルトテストを実行します(ただし、実行中の文書テストは実行されません .rst 文書は,これらのファイルが実装されていないため).

呼び出し中にパケットを指定することで、特定のパケットのテストを実行することができます test() 機能::

astropy.test(package='io.fits')

この方法は,Astropyディレクトリにマッピング可能なパケット名にのみ適用可能である.別の選択として、以下のコマンドを使用して、特定のディレクトリまたはファイルをテストすることができます test_path オプション::

astropy.test(test_path='wcs/tests/test_wcs.py')

♪the test_path 勤務目録または絶対的に指定されなければならない。

デフォルトの場合 astropy.test() インターネットからデータを検索するテストをスキップする.これらのテストを開くには、ご利用ください remote_data マーク::

astropy.test(package='io.fits', remote_data=True)

また、 test 関数サポートは pytest.main() 便利なオプションがあります verbose= そして pastebin= それがそうです。

PEP 8適合性テストの有効化 pep8=True 呼び出している astropy.test それがそうです。これはPEP 8チェックを有効にし、通常のテストを無効にするだろう。

Astropy検定関数

astropy.test(**kwargs)

パッケージのテストを実行します。

この方法はパラメータを生成し,呼び出しを行う. pytest.main それがそうです。

パラメータ
package文字列、オプション

テストする特定のパケットの名前、例えば‘io.fits’または‘utils’である。コンマで区切られた文字列は、複数のパケットを指定するために受け入れられます。コンテンツが指定されていない場合は、すべてのデフォルトテストが実行されます。

args文字列、オプション

伝達する他のパラメータは pytest.main はい。 args キーワードパラメータ。

docs_path文字列、オプション

ドキュメント.rstファイルのパス。

open_filesブル値、オプション

任意のテストがファイルをオープン状態にした場合に失敗します。これは、テストキットに追加の実行時間が追加されるので、デフォルトでオフになります。必要なのは psutil 小包です。

parallelIntまたは‘auto’は、オプションです

提供された場合は、指定された数のCPU上でテストを並列に実行してください。もし並行して 'auto' これは,マシン上のすべてのカーネルを使用する.必要なのは pytest-xdist プラグインです。

pastebin(‘FAILED’,‘ALL’,NONE),オプション

便利なオプションは、最も暑い粘着シールを開けて出力するためのものです。‘Failed’に設定された失敗テストの情報をアップロードするか、または‘All’がすべてのテストの情報をアップロードできるように設定します。

pdbブル値、オプション

失敗したテストのためにPDB検視分析を開いた。指定と --pdb はい。 args それがそうです。

pep8ブル値、オプション

Pytest-Pep 8プラグインでPEG 8チェックを開き、正常なテストを無効にします。指定と --pep8 -k pep8 はい。 args それがそうです。

pluginsリスト、オプション

渡すプラグイン pytest.main はい。 plugins キーワードパラメータ。

remote_data{‘None’,‘Astpy’,‘Any’},オプション

@pytest.mark.remote_dataとラベル付けされたテストを実行するかどうかを制御する.リモートデータを使用せずにテストを実行するように設定することができます (none )は、http://data.astterpy.orgからのデータのみを使用します。 (astropy )またはリモートデータを使用したすべてのテスト (any )である。黙認する. none それがそうです。

繰り返すint オプションです。形が整っていて、オプションです

設定されていれば,各テストを何回実行すべきかを指定する.これは散発的な故障の診断に有用である。

skip_docsbool オプションです。ブル値、オプション

いつ? True .rstファイルでドキュメントテストを実行することをスキップします。

test_path文字列、オプション

パスごとにテストする位置を指定します。単一のファイルまたはディレクトリであってもよい。絶対的に指定するか、または呼び出しディレクトリに対して指定しなければなりません。

verboseブル値、オプション

Pytestの詳細出力の便利なオプションを開きます。Trueと指定を転送する -v はい。 args それがそうです。

テスト実行オプション

開いた書類をテストする

使用 Pytest-openfiles プラグイン(pytest-Asterpyをインストールする際に自動インストール)では,無意識に開いたファイルが残っているセルテストがあるかどうかをテストすることができる.これは,テストを実行するのに要する時間を大幅に低下させるため,デフォルトではオフである.

これを命令行使から使用するには、以下の操作を実行してください。

pytest --open-files

Pythonで使用するには、以下の操作を実行してください。

>>> import astropy
>>> astropy.test(open_files=True)

関係がある pytest-openfiles プラグインは参照 Pytest-openfiles

テストカバー率報告

カバー範囲報告はご利用いただけます pytest-cov プラグイン(pytest-Asterpyのインストール時に自動インストール)、例えば:

pytest --cov astropy --cov-report html

いくつかの構成があります setup.cfg 省略するファイルと除外する行のファイルを定義する.

並行してテストを実行する

使用できる pytest-xdist プラグインです。

インストール後、ご利用いただけます '-n' コマンドラインオプション。たとえば,4つのプロセスを用いる:

pytest -n 4

通行証. -n auto 計算機上のカーネルと同数のプロセスを作成するためには,以下の操作を実行してください.

同様に、この機能は、以下の位置から呼び出されてもよい astropy.test **

>>> import astropy
>>> astropy.test(parallel=4)

テストを書く

pytest 以下のテスト発見ルールを持つ:

  • test_*.py あるいは…。 *_test.py 書類

  • Test 接頭辞付き類(持たない) __init__ 方法)

  • test_ プレフィックス付き関数および方法

相談する. test discovery rules それらを自動的に発見するためにファイルやテストをどのように命名するかについては、詳細を参照されたい pytest それがそうです。

簡単な例

以下の例は、簡単な関数およびこの関数をテストするテストを示す。

def func(x):
    """Add one to the argument."""
    return x + 1

def test_answer():
    """Check the return value of func() for an example argument."""
    assert func(3) == 5

これを一つに置くと test.py ファイル、そして実行::

pytest test.py

その結果:

============================= test session starts ==============================
python: platform darwin -- Python 3.x.x -- pytest-x.x.x
test object 1: /Users/username/tmp/test.py

test.py F

=================================== FAILURES ===================================
_________________________________ test_answer __________________________________

    def test_answer():
>       assert func(3) == 5
E       assert 4 == 5
E        +  where 4 = func(3)

test.py:5: AssertionError
=========================== 1 failed in 0.07 seconds ===========================

どこでテストを行いますか

ソフトウェアパッケージに特化したテスト

各パケットは、可能な限り多くの共通方法/関数をカバーするユニットテストのセットを含むべきである。これらのテストは、例えば、各サブパケットに含まれるべきである。

astropy/io/fits/tests/

tests カタログは1つを含むべきである __init__.py ファイルは,テストを導入できるようにし,相対導入を用いることができる.

相互運用性テスト

2つ以上のサブパケットに関するテストは、以下のように含まれるべきである。

astropy/tests/

回帰テスト

いつエラーを修復しても、可能であれば、将来このエラーが導入されないことを保証するために、1つまたは複数の回帰テストを追加すべきである。回帰テストにはエラーを報告するチケットURLが含まれなければならない。

データファイルを使用する

データファイルを使用する必要があるテストは使用すべきである get_pkg_data_fileobj あるいは…。 get_pkg_data_filename 機能します。これらの関数は,まずローカル検索,次にAsterpyデータサーバまたは任意のURLで検索し,それぞれ類似ファイルのオブジェクトまたはローカルファイル名を返す.リモートデータが取得されると、それらは自動的にローカルにデータをキャッシュし、それ以来、ローカルコピーを透過的に使用する。テストでキャッシュを扱う特定の説明については,次節を参照されたい.

これらはまた、MD 5ハッシュを使用してデータファイルの特定のバージョンを取得することをサポートする。Asterpyデータサーバにファイルを提出する前に、ご利用いただけます compute_hash 関数はファイルのローカルコピー上で実行される.

遠隔データを検索可能なテストは @pytest.mark.remote_data 装飾符、または、文書テストであれば、 REMOTE_DATA 旗です。デフォルトでは,このように表記されたテストをスキップする. astropy.test() テスト実行時間が長すぎることを防ぐために。これらのテストは astropy.test() 追加することで remote_data='any' 旗です。コマンドラインでは、以下のコマンドを使用してリモートデータテストを開きます pytest --remote-data=any それがそうです。

以下のコマンドタグテストを使用することができます @pytest.mark.remote_data(source='astropy') 一意の必要を示すデータは、http://data.asterpy.orgサーバからのものであることを示すために使用することができる。これらのテストのみを有効にするためには、以下のコマンドを使用してテストを実行する pytest --remote-data=astropy それがそうです。

関係がある pytest-remotedata プラグイン、参照してください 最も遠いデータ それがそうです。

実例.

from ...config import get_data_filename

def test_1():
    """Test version using a local file."""
    #if filename.fits is a local file in the source distribution
    datafile = get_data_filename('filename.fits')
    # do the test

@pytest.mark.remote_data
def test_2():
    """Test version using a remote file."""
    #this is the hash for a particular version of a file stored on the
    #astropy data server.
    datafile = get_data_filename('hash/94935ac31d585f68041c08f87d1a19d4')
    # do the test

def doctest_example():
    """
    >>> datafile = get_data_filename('hash/94935')  # doctest: +REMOTE_DATA
    """
    pass

♪the get_remote_test_data 属性指示の一時ディレクトリにこれらのファイルを配置する. tempfile モジュールは,このようにテストファイルが最終的にシステムによって削除される.長期的には,テストデータファイルが大きすぎると,テストデータを即座に削除する機構を設計する必要がある.

ファイルキャッシュを用いたテスト

デフォルトでは、Astropyテスト実行器は、そのテスト実行のみのための一時ディレクトリにきれいなファイルキャッシュを設定し、破棄します。これは,テスト実行間の一貫性を確保し,ユーザのキャッシュ(すなわち,返されたキャッシュディレクトリを乱さないこと)を確保するためである. get_cache_dir )とテストファイル。

しかしながら、いくつかのテスト著者(特にアクセサリパッケージのため)は、テスト実行中にダウンロードされたファイルを(例えば、大型データセットの場合)より持続的な位置にキャッシュすることが望ましいことを発見することができるかもしれない。そのためには set_temp_cache ヘルパーが使えます。これは、キャッシュをカスタム位置に一時的に設定するために、テスト中のコンテキストマネージャとして使用することもできるし、使用することもできる。 装飾師. これは、テスト機能全体に有効である(SETUPまたはTEARDOWNは含まれておらず、個別に装飾されていなければならない)。

属性は,テスト実行中にキャッシュディレクトリの位置を変更することができる. XDG_CACHE_HOME 環境変数

ファイル作成のテスト

テストはユーザが書き込み権限のないディレクトリからつねに実行される可能性があるため,ファイルを作成するテストはつねに一時ディレクトリで実行すべきである.これは使えます pytest 'tmpdir' fixture Pythonの内蔵を使って tempfile module それがそうです。

設定·解体テスト

場合によっては、いくつかのコンテンツを先に設定する必要がある一連のテストを実行することは有用かもしれない。4つの方法があります

モジュールレベルの設定·取り外し

もし setup_module そして teardown_module 関数はファイルに指定され,それぞれファイル中のすべてのテストの前と後に呼び出される.これらの関数は、モジュール自体のパラメータを受け取り、これにより、モジュール範囲の変数を設定することが非常に容易になる。

def setup_module(module):
    """Initialize the value of NUM."""
    module.NUM = 11

def add_num(x):
    """Add pre-defined NUM to the argument."""
    return x + NUM

def test_42():
    """Ensure that add_num() adds the correct NUM to its argument."""
    added = add_num(42)
    assert added == 53

例えば、遠隔テストデータファイルをダウンロードし、ファイル内のすべての関数をアクセスさせるために使用することができる:

import os

def setup_module(module):
    """Store a copy of the remote test file."""
    module.DATAFILE = get_remote_test_data('94935ac31d585f68041c08f87d1a19d4')

def test():
    """Perform test using cached remote input file."""
    f = open(DATAFILE, 'rb')
    # do the test

def teardown_module(module):
    """Clean up remote test file copy."""
    os.remove(DATAFILE)

クラスレベルの設定/取り外し

テストを自分の設定/解体機能を持つクラスに編成することができる.以下の点で:

def add_nums(x, y):
    """Add two numbers."""
    return x + y

class TestAdd42(object):
    """Test for add_nums with y=42."""

    def setup_class(self):
        self.NUM = 42

    def test_1(self):
        """Test behavior for a specific input value."""
        added = add_nums(11, self.NUM)
        assert added == 53

    def test_2(self):
        """Test behavior for another input value."""
        added = add_nums(13, self.NUM)
        assert added == 55

    def teardown_class(self):
        pass

上の例では setup_class メソッド,そしてクラス中のすべてのテストを呼び出し,最後に呼び出す. teardown_class と言います。

メソッドレベルの設定·取り外し

場合によっては、ユーザは、SetupおよびtearDown方法を前後に実行することを望むことができる each テストします。そのために、お使いください setup_method そして teardown_method 方法:

def add_nums(x, y):
    """Add two numbers."""
    return x + y

class TestAdd42(object):
    """Test for add_nums with y=42."""

    def setup_method(self, method):
        self.NUM = 42

    def test_1(self):
    """Test behavior for a specific input value."""
        added = add_nums(11, self.NUM)
        assert added == 53

    def test_2(self):
    """Test behavior for another input value."""
        added = add_nums(13, self.NUM)
        assert added == 55

    def teardown_method(self, method):
        pass

機能レベルの設定·取り外し

最後に私たちは setup_function そして teardown_function モジュール内の各関数の前後で動作する設定/解体機構を定義する.これらのパラメータは1つのパラメータ、すなわちテストされた関数のみである:

def setup_function(function):
    pass

def test_1(self):
   """First test."""
    # do test

def test_2(self):
    """Second test."""
    # do test

def teardown_function(function):
    pass

属性に基づくテスト

Property-based testing “1+2に適用する”ではなく、“任意の2つの数字に適用する”というより一般的な声明を提示することで、テストで重要な部分に集中することができます。ランダムテストが最小の欠陥のない失敗例を提供し、最も複雑なデータであっても明確な記述方法を提供していると想像してみてください--これが属性に基づくテストです!

pytest-astropy 対も含めて Hypothesis したがって、インストールは容易です-文書を読むだけで work through the tutorial テストを始めました

from astropy.coordinates import SkyCoord
from hypothesis import given, strategies as st

@given(
    st.builds(SkyCoord, ra=st.floats(0, 360), dec=st.floats(-90, 90))
)
def test_coordinate_transform(coord):
    """Test that sky coord can be translated from ICRS to Galactic and back."""
    assert coord == coord.galactic.icrs  # floating-point precision alert!

あなたがテストできる他の属性は:

  • 歪みのないマップでは,画像から空座標への往復は可逆的であるはずであり,そうでなければつねに10−5 px未満である。

  • 時間をかけて、異なるフレーム間を往復し、精度が変化していないか、または失われていないかをチェックする。(あるいは少なくとも1ナノ秒を超えない)

  • IOルーチンで処理されるべき可逆往復データ

  • 許容差の範囲内で、最適化されたルーチン計算の結果は、最適化されていないものと同じである

これはAstropyに貢献し始めた良い方法であり、時間処理においてエラーが発見された。詳細については、質問#9017と引取要求#9532を参照してください!

もしあなたの研究で有用であることが分かったら please cite it !)

パラメータ化検査

少し違う値を複数回テストする場合は、ご利用いただけます pytest 独自のテストを作成することを避けています例えば、以下のように書くのではありません。

def test1():
    assert type('a') == str

def test2():
    assert type('b') == str

def test3():
    assert type('c') == str

ご利用いただけます @pytest.mark.parametrize 修飾器は、入力毎に簡明に試験関数を作成する:

@pytest.mark.parametrize(('letter'), ['a', 'b', 'c'])
def test(letter):
    """Check that the input is a string."""
    assert type(letter) == str

ガイドラインとしてご利用ください parametrize すべての可能なテストケースを列挙することができ、各失敗が異なる問題および仮定になる場合、多くの可能な入力がある場合、または簡単な失敗だけを報告したい場合、このような場合があります。

オプション依存項のテストが必要です

テストには、任意の依存項(例えばScipy)を必要とする関数または方法のテストが必要であり、依存項が存在しない場合、pytestがテストをスキップすることを示すべきである。以下の例は、この動作をどのように実行すべきかを示す。

import pytest

try:
    import scipy
    HAS_SCIPY = True
except ImportError:
    HAS_SCIPY = False

@pytest.mark.skipif('not HAS_SCIPY')
def test_that_uses_scipy():
    ...

このように,Scipyが存在すればテストを実行し,存在しなければテストをスキップする.どんなテストもオプション依存項が存在しないだけで失敗してはいけない。

Pytestヘルパー関数を使用する

もしあなたのテストに使用する必要があれば pytest helper functions 例えば、 pytest.raises 導入,導入 pytest 以下のように、あなたのテストモジュールに追加します。

import pytest

警告をテストする

場合によっては予想されるように警告をトリガするかどうかをテストするために pytest 自分のコンテキストマネージャを提供する pytest.warns これは全く似ています pytest.raises 特定の警告クラスを明示的に検出し、任意のものを通過することを可能にする match 論拠、情報。指定されたタイプの警告がトリガされていない場合、これはテスト失敗を招くことに注意されたい。オプションではありませんが強制的な警告ではありません pytest.warns(None) それらを捕捉して検査することができます

注釈

使用 pytest お選びいただけます recwarn 関数パラメータは、警告が埋め込み関数全体にわたってトリガされるかどうかをテストするために使用される。少なくとも一つの場合、この方法は問題があることが発見された。 (pull request 1174 )。

異常をテストする

上述した警告の処理のように、何らかのエラーをトリガすることが意図されたテストは、予期されるタイプの例外が予期される位置で開始されるかどうかを検証すべきである。メソッドでテストを行ったコードはこれを効率的に実現することができる. pytest.raises コンテキストマネージャ。これはオプションです。 match パラメータは、以下のコマンドを使用して任意のパターンのエラーメッセージをチェックすることを許可 regex 文法です。例えばマッチは pytest.raises(OSError, match=r'^No such file') そして pytest.raises(OSError, match=r'or directory$') これは assert str(err).startswith(No such file) そして assert str(err).endswith(or directory) それぞれ誘発されたエラーメッセージに err それがそうです。複数のメッセージを一致させるためには、 (?s) flag 下の階までの re.search 以下の例を示す.

with pytest.raises(fits.VerifyError, match=r'(?s)not upper.+ Illegal key') as excinfo:
    hdu.verify('fix+exception')
assert str(excinfo.value).count('Card') == 2

この呼び出しはどうやって得るかを説明しています ExceptionInfo オブジェクトはメッセージを返して他の診断を行う.

構成パラメータのテスト

テストの再現性を確保するために,すべての配置項目はテスト実行器起動時にデフォルト値にリセットされる.

ある構成項目が特定の値に設定されている場合、コードの動作をテストしたい場合があります。この場合、ご利用いただけます astropy.config.ConfigItem.set_temp コンテキストマネージャは、設定項目をこの値に一時的に設定し、コンテキストでテストを行い、元の値を自動的に返す。

例えば:

def test_pprint():
    from ... import conf
    with conf.set_temp('max_lines', 6):
        # ...

カバー範囲から除外するコードブロックをマークする.

カバー率テストは,フレーズを含むアノテーションを付加することでコードブロックを無視することができる. pragma: no cover ブロックの先頭:

if this_rarely_happens:  # pragma: no cover
    this_call_is_ignored()

Pytest-mplを用いた画像テスト

イメージテストの実行

私たちは pytest-mpl テストのためのプラグインを作成するために、描画コマンドの出力を参照ファイルと画素毎に比較することができる(例えば、ここでは、 astropy.visualization.wcsaxes )。

画像比較付きAstropyテストを行うには、使用してください::

pytest --mpl --remote-data

しかし,出力はMatplotlibのバージョンとそのすべての依存項(例えばfreetype)に非常に敏感である可能性があることに注意されたい. Docker 容器は、凍結されたパケットバージョンのセットを有する(Docker容器はミニ仮想マシンと考えることができる)。私たちはすでに set of Docker container images これを作るために使えるものです。Dockerをインストールした後、DockerコンテナでAstropyテストを実行して画像比較を行うには、Astropyリポジトリ(またはテスト中のソフトウェアパッケージのリポジトリ)にあることを確認し、以下の操作を実行してください。

docker run -it -v ${PWD}:/repo astropy/image-tests-py35-mpl300:1.3 /bin/bash

これはDockerコンテナでbashプロンプトを起動します。以下のようなものが見られるはずです。

root@8173d2494b0b:/#

今回ってもいいです /repo ディレクトリ、このディレクトリは、テスト中のリポジトリのローカルバージョンと同じです。

cd /repo

そして、上記のようにテストを実行することができます:

pip install -e .[test]
pytest --mpl --remote-data

タイプ exit コンテナから離れることができます

利用可能なDocker画像の名前を見つけることができます Docker Hub それがそうです。

画像テストを作成する

♪the README.rst このプラグインを用いたテスト作成に関する情報が含まれています。これらの説明と比較して、唯一の重要な追加はあなたが設定すべきことです。 baseline_dir **

from astropy.tests.image_tests import IMAGE_REFERENCE_DIR

@pytest.mark.mpl_image_compare(baseline_dir=IMAGE_REFERENCE_DIR)

これは,参照画像ファイルがリポジトリサイズに大きく影響するため,http://data.asterpy.orgサイトに格納するためである.欠点は、参照ファイルを作成または再生成することがやや複雑であることであるが、ここではこのプロセスを説明する。

参照画像を生成する

参照画像を生成(再)するテストがありましたら、以下のコマンドを使用してDockerコンテナのうちの1つを起動してください。

docker run -it -v ${PWD}:/repo astropy/image-tests-py35-mpl300:1.3 /bin/bash

そして中でテストを行います /repo--mpl-generate-path パラメータ、例えば:

cd repo
pip install -e .[test]
pytest --mpl --mpl-generate-path=reference_tmp --remote-data

これは reference_tmp フォルダは、生成された参照画像をその中に配置し、フォルダはDockerコンテナの外部のリポジトリで利用可能である。タイプ exit コンテナから離れることができます

利用可能なコンテナを使用して、異なるサポートされているMatplotlibバージョンのための画像を生成することを確実にする。

参考画像をアップロードする

次に,これらの画像をhttp://data.asterpy.orgサーバに追加する必要がある.この操作を実行するには、引取要求を開いてください this 貯蔵庫です。Astropyテストの参照画像は testing/astropy カタログです。このディレクトリにはタイムスタンプというフォルダがある.新しいテストを追加するだけであれば、参照ファイルを最新ディレクトリに追加してください。

Astropyの変更によりベースライン画像が再生成された場合、最新のタイムスタンプディレクトリをコピーすることによって新しいタイムスタンプディレクトリを作成し、その後、変更された任意のベースライン画像を置換してください。Matplotlibバージョン間の変化により、主要なMatplotlibバージョンごとに参照画像のセットを追加する必要があることに注意されたい。このため、タイムスタンプフォルダ毎に、“TIMESTAMP”というフォルダがある。 1.4.x そして 1.5.x それがそうです。

参照画像がhttp://data.asterpy.orgにマージされて利用可能になりましたら、更新してください IMAGE_REFERENCE_DIR 中の変数 astropy.tests.image_tests サブモジュールです。タイムスタンプはハードコードであるため、新たなタイムスタンプディレクトリを追加することは、Astropyリリースバージョンのテストに干渉することがないため、Astropyへのプル取り要求を処理しながら、新しいタイムスタンプディレクトリを容易に追加して調整することができる。

文書テストを作成する

Pythonのdoctestは、関数、クラス、またはモジュールのdocstringに埋め込まれたり、記述されたSphinx文書に埋め込まれたり、Python対話会話のように見えるようにフォーマットされた特殊なタイプのテストです--つまり、表示されています >>> プロンプトは,インタラクティブなセッションでそのコードを実行する際に予想される出力(あれば)の後に続く.

この考え方は,文書文字列を用いて用法例を作成し,ユーザは逐語入力し,期待出力に合わせて出力をチェックし,インタフェースが正しく使用されていることを確認することができる.

さらにPythonには doctest これらの文書テストを検出し,プロジェクト自動化テストキットの一部として実行することができるモジュール.これにより,文書文字列中のすべてのdoctestのような例が正しいことを自動的に確保することができる.

Astropyテストキットは、Astropyソースコードまたは文書中の任意のdoctestを自動的に検出して実行するか、またはAstropyテストを使用してフレームワークのパッケージ内の任意のdoctestを実行する。例えば、文書テストやそれらの詳細な文書の作成方法については、完全なものを参照されたい doctest 書類です。

注釈

Narrative Sphinx文書はAstpyソースコードとともに実装されていないため,以下の命令を実行することでしかテストできない. pytest 直接(または毒理によって)通過するのではなく import astropy; astropy.test() それがそうです。

関係がある pytest-doctestplus Astropyで使用されているプラグインは、参照されたい Pytest-doctestplus それがそうです。

文書テストをスキップしています

Doctestのように見えるが実際には逐語実行できない例を作成する必要がある場合がある.例えば、一例は、いくつかの外部条件が満たされることに依存することができる。これらの場合、文書テストをスキップする方法がいくつかあります。

  1. 例の横に以下の注釈を付加する: # doctest: +SKIP それがそうです。例:

    >>> import os
    >>> os.listdir('.')  # doctest: +SKIP
    

    上記の例では、ユーザの動作を誘導したいと考えています os.listdir('.') しかし、私たちはその行がdoctestの一部として実行されることを望まない。

    リモートデータを抽出するテストをスキップする場合は、ご利用ください REMOTE_DATA 旗に変更する。このようにして、使用することができます --remote-data テスト実行時のマーク:

    >>> datafile = get_data_filename('hash/94935')  # doctest: +REMOTE_DATA
    
  2. Astropyのテストフレームワークは特殊性を増加させた __doctest_skip__ 変数は、doctestを実行すべきでないモジュール内の関数、クラス、および方法をリストするために、任意のモジュールのモジュールレベルに配置されてもよい。すなわち,関数の例用法をdoctestとして実行することは意味がなければ,doctest収集段階で関数全体をスキップすることができる.

    の価値 __doctest_skip__ 文書テストをスキップすべきすべての関数/クラスのワイルドカードパターンリストであるべきである.例えば:

    __doctest_skip__ = ['myfunction', 'MyClass', 'MyClass.*']
    

    名を飛び越える myfunction クラス名のdoctestは MyClass そしてすべてが 方法MyClass それがそうです。

    モジュール文書文字列は,文書テストを含むことも可能である.モジュールレベルの文書テストをスキップするには、文字列を含めてください '.' はい。 __doctest_skip__ それがそうです。

    モジュール内のすべての文書テストをスキップするには、以下の操作を実行してください。

    __doctest_skip__ = ['*']
    
  3. Sphinx文書では,doctest部分をスキップすることができ,これを手法としている doctest-skip コマンド::

    .. doctest-skip::
    
        >>> # This is a doctest that will appear in the documentation,
        >>> # but will not be executed by the testing framework.
        >>> 1 / 0  # Divide by zero, ouch!
    

    属性は特定の行以下のすべての文書をスキップしてテストすることも可能である. doctest-skip-all コメントする。不足にご注意ください :: ここでの行尾:

    .. doctest-skip-all
    
    All doctests below here are skipped...
    
  4. __doctest_requires__ 特定の文書テストの依存項を列挙する方法である.これはマッピングワイルドカードパターンの辞書であるべきです __doctest_skip__ )を1つまたは複数のモジュールのリストに追加し、これらのモジュールは 導入可能 テストを実行させることができます例えば、いくつかのテスト要求Scipyモジュールが動作している場合、それらはスキップされなければなりません。 import scipy 可能です。このdictとしてワイルドカードパターンのタプルを使用することもできる:中のキーワード

    __doctest_requires__ = {('func1', 'func2'): ['scipy']}
    

    このモジュールレベルの変数を持つには scipy 関数のdoctestを実行するために導入することができる func1 そして func2 そのモジュールにあります。

    Sphinx文書では,文書テスト要求が利用可能である. doctest-requires コマンド::

    .. doctest-requires:: scipy
    
        >>> import scipy
        >>> scipy.hamming(...)
    

出力をスキップしています

Doctestを作成する重要な点の1つは,サンプル出力とテスト実行時に生じる実際の出力を正確に比較できることである.

デフォルトでは,doctestシステムは実際の出力をサンプル出力と逐語比較するが,これはつねに可能ではない.例えば、例示的な出力は、 __repr__ そのid(実行ごとに変更される)を示すオブジェクトや,異常が期待されるテストはバックトラックを出力する可能性がある.

要約例の出力の最も簡単な方法は,省略番号を用いることである ... それがそうです。例えば:

>>> 1 / 0
Traceback (most recent call last):
...
ZeroDivisionError: integer division or modulo by zero

このdoctestはバックトラックの異常を持つことが望ましいが,サンプル出力ではバックトラックのテキストをスキップし,出力の1行目と最後の行のみを検査する.ご参照ください doctest 出力をスキップするより多くの例については、文書を参照されたい。

すべての出力を無視する

出力を無視するもう1つの可能性は # doctest: +IGNORE_OUTPUT 旗です。これによりdoctestが実行され(コード実行時に誤りがないかどうかをチェックする)ことができるが,出力が何であるかを気にせずに出力全体を無視することが許される.これが省略番号を使用するのと異なる点は、まだ完全な例示的な出力を提供することができるが、それが完全に正しいかどうかを検査する必要がない点である。例えば:

>>> print('Hello world')  
We don't really care what the output is as long as there were no errors...

浮動小数点出力を処理する

いくつかの文書テストでは,浮動小数点値を含む文字列表現形式の出力が生成される可能性がある.浮動小数点表現は、一般に正確ではなく、最下位ビットの丸めを含む。テストを実行するプラットフォーム(異なるPythonバージョン、異なるオペレーティングシステムなど)によって表示されている正確な桁数は異なることができる.Doctestは文字列を比較することで動作するため,このようなテストに失敗する可能性がある

この問題を解決するためには pytest-doctestplus プラグインは正しいものを提供します FLOAT_CMP Doctestと一緒に使えるマークです。例えば:

>>> 1.0 / 3.0  # doctest: +FLOAT_CMP
0.333333333333333311

このフラグを用いた場合,期待出力と実際の出力を同時に解析して,文字列中の任意の浮動小数点値を探す.実際のPythonに変換します float 対象は,数値的に比較する.これは,文書テストが丸められた数字表現の細かな違いを無視することを意味する.これらの値は、他の態様で正確に比較されているので、これらのテストは、依然として、より顕著な(小さい可能性があるにもかかわらず)差を捉えることができる。

連続集積

概要

Astropyは、以下の持続的統合(CI)サービスを使用します。

  • GitHub Actions 64ビットLinux、OS X、およびWindows設定(GitHub動作にはまだ“許可された失敗”がないことに注意してください。したがって、PRレポートのための失敗ジョブを見ることができ、その名前に“(許可された失敗)”が付いている場合があります。それにもかかわらず、いくつかの失敗は真実かもしれませんし、あなたの変更と関係があるので、どうしてもチェックしてみてください!)

  • CircleCI 32ビットLinux、ドキュメント構築、可視化テストのための

それらは、いつ障害が発生するかに注意するために、GitHubにプッシュされるパケット内の各提出および引き出し要求を継続的にテストする。

Astropyと多くの付属ソフトウェアパッケージは、1つの名前を使用しています。 ci-helpers CIシステムの汎用部分をサポートする.

依存項は,関連YAMLファイル中の適切な環境変数を用いて異なるパケットでカスタマイズすることができる.この機械の設定方法の詳細については、参照されたい package-template そして ci-helpers それがそうです。

CircleCI上の32ビットテスト使用 quay.io/pypa/manylinux1_i686 Dockerミラーリングは、各主要Pythonバージョンの32ビットPython環境を含みます。CircleCIを参照してください configuration file 異なるPythonバージョンのコアパッケージにどのようにアクセスするかについては、参照してください。

場合によっては、例えば、オペレーティングシステムが異なるため、または障害が32ビットPythonでのみ発生するため、持続的な統合サービスでローカルには見えない障害を見ることができます。以下の各節では,特定の生成をローカルにどのように複製するかを説明する.

複製に失敗した32ビット生成

CircleCIで同じ32ビットPython環境でテストを実行したい場合は、インストールから Docker もしあなたがまだそれをインストールしていなかったら。Dockerは様々なオペレーティングシステムにインストールすることができる.

その後、テストを実行するために、gitリポジトリ(プライマリAstropyリポジトリまたは分岐リポジトリ)のバージョンがあることを確認します。このディレクトリに転送して使用します:Dockerを実行します

$ docker run -i -v ${PWD}:/astropy_src -t quay.io/pypa/manylinux1_i686 bash

これはDocker容器内のbash shellにあなたを入れます。一度入ったら行ってもいいです /astropy_src ディレクトリには、ローカルgitリポジトリのファイルが見られるはずです。

root@5e2b89d7b07c:/# cd /astropy_src
root@5e2b89d7b07c:/astropy_src# ls
astropy                     conftest.py      licenses              setup.py
cextern                     CONTRIBUTING.md  MANIFEST.in       static
CHANGES.rst         docs             pip-requirements  tox.ini
CITATION            examples             pyproject.toml
codecov.yml         GOVERNANCE.md    README.rst
CODE_OF_CONDUCT.md  LICENSE.rst      setup.cfg

その後、以下のコマンドを使用してテストを実行することができます。

root@5e2b89d7b07c:/astropy_src# /opt/python/cp36-cp36m/bin/pip install -e .[test]
root@5e2b89d7b07c:/astropy_src# pytest

最熱プラグイン

以下は…。 pytest plugins are maintained and used by Astropy. They are included as dependencies to the pytest-astropy package, which is now required for testing Astropy. More information on all of the plugins provided by the pytest-astropy package (including dependencies not maintained by Astropy) can be found here それがそうです。

最も遠いデータ

♪the pytest-remotedata プラグインは、開発者がインターネットからデータにアクセスするテストを実行するかどうかを制御することを可能にプラグインは、単一のテスト関数またはテストクラス全体をマークするために使用可能な2つの修飾子を提供する:

  • @pytest.mark.remote_data Internetからのデータを必要とするテストに用いられる.

  • @pytest.mark.internet_off Internetアクセスがない場合にのみ実行されるべきテストです。ネットワークアクセスが利用できない場合、これは、ローカルデータキャッシュまたはフォールバックをテストするために非常に有用である。

このプラグインは追加されました --remote-data オプションを追加します pytest 命令(Astropyテスト実行プログラムによりその命令を取得することも可能である).

もし --remote-data テストキットを実行する際にオプションを提供しない、または --remote-data=none すべてのタグは remote_data 飛び越えることになりますと表記する. internet_off 処刑される。Internetへのアクセスを試みましたがマークされていません remote_data 失敗を招くことになります

以下の2つの場合のうちの1つを提供する。 --remote-data 選択肢、あるいは --remote-data=any 全てのタグは remote_data 処刑される。と表記する. internet_off 飛び越えることになります

運用テストを使用する --remote-data=astropy これにより、Astropyデータソースからリモートデータを受信するテストのみが実行されます。他のデータソースとのテストはスキップされます。これは,テストコードにおいてタグテスト関数を用いることで示される. @pytest.mark.remote_data(source='astropy') それがそうです。表示されている internet_off この場合もスキップされるだろう。

また会いましょう データファイルを使用する それがそうです。

Pytest-doctestplus

♪the pytest-doctestplus プラグインは、高度な文書テスト機能を提供します。

このプラグインは、2つのコマンドラインオプションを提供します: --doctest-plus 上記の高度な機能を有効にするための、および --doctest-rst 含まれています *.rst Doctest集合中のファイル.

Astropyテスト実行器は、デフォルトでこの2つのオプションを有効にします。直接従すると pytest (Astropyテスト実行器を通過するのではなく)、必要に応じてこれらのオプションを明示的に提供する必要がある。

Pytest-openfiles

♪the pytest-openfiles プラグインは、セルテスト終了時にオープンなI/Oリソースを検出することを可能にします。このプラグインは追加されました --open-files オプションを追加します pytest 命令(この命令もAstropyテスト実行プログラムで公開される).

運行テストを使用した場合 --open-files ユニットテスト中にファイルが開いたが、テストが終了する前にファイルが閉じられていない場合、テストは失敗する。これは,操作ファイルハンドルや他のI/Oリソースをテストするコードに特に有用である.これは,開発者がこのようなコードがI/O資源が不要になったときにそれらを正確に掃除することを保証することを可能にする.

また会いましょう 開いた書類をテストする それがそうです。