テストガイド.¶
本節では,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_docs :
bool
オプションです。ブル値、オプション いつ?
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のように見えるが実際には逐語実行できない例を作成する必要がある場合がある.例えば、一例は、いくつかの外部条件が満たされることに依存することができる。これらの場合、文書テストをスキップする方法がいくつかあります。
例の横に以下の注釈を付加する:
# doctest: +SKIP
それがそうです。例:>>> import os >>> os.listdir('.') # doctest: +SKIP
上記の例では、ユーザの動作を誘導したいと考えています
os.listdir('.')
しかし、私たちはその行がdoctestの一部として実行されることを望まない。リモートデータを抽出するテストをスキップする場合は、ご利用ください
REMOTE_DATA
旗に変更する。このようにして、使用することができます--remote-data
テスト実行時のマーク:>>> datafile = get_data_filename('hash/94935') # doctest: +REMOTE_DATA
Astropyのテストフレームワークは特殊性を増加させた
__doctest_skip__
変数は、doctestを実行すべきでないモジュール内の関数、クラス、および方法をリストするために、任意のモジュールのモジュールレベルに配置されてもよい。すなわち,関数の例用法をdoctestとして実行することは意味がなければ,doctest収集段階で関数全体をスキップすることができる.の価値
__doctest_skip__
文書テストをスキップすべきすべての関数/クラスのワイルドカードパターンリストであるべきである.例えば:__doctest_skip__ = ['myfunction', 'MyClass', 'MyClass.*']
名を飛び越える
myfunction
クラス名のdoctestはMyClass
そしてすべてが 方法 のMyClass
それがそうです。モジュール文書文字列は,文書テストを含むことも可能である.モジュールレベルの文書テストをスキップするには、文字列を含めてください
'.'
はい。__doctest_skip__
それがそうです。モジュール内のすべての文書テストをスキップするには、以下の操作を実行してください。
__doctest_skip__ = ['*']
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...
__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 プラグインは、高度な文書テスト機能を提供します。
遠隔データを用いた文書テストを組み合わせた処理
pytest-remotedata
上のプラグイン(参照) データファイルを使用する )浮動小数点結果を生成する文書テストの近似浮動小数点比較(参照 浮動小数点出力を処理する )
Doctestを実行する際には特定のクラス,方法,関数をスキップする(参照 文書テストをスキップしています )
オプションの包含
*.rst
文書テスト用ファイル
このプラグインは、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資源が不要になったときにそれらを正確に掃除することを保証することを可能にする.
また会いましょう 開いた書類をテストする それがそうです。