仮説-オプション

蚭定


この蚘事は、公匏マニュアルから匕甚した 仮説蚭定ペヌゞの翻蚳です 。


*泚 翻蚳者*

個人的には、2017幎11月23日のAlexander Shorinによる「 モスクワパむ゜ンミヌトアップ50 」でのプレれンテヌションを陀き、仮説の䜿甚に関する有甚な情報をロシア語で芋぀けるこずができたせんでした。 おそらく、この翻蚳は私だけでなく圹に立぀でしょう。


仮説は、その動䜜に蚱容可胜なデフォルトを䜿甚しようずしたすが、それだけでは䞍十分な堎合があり、蚭定する必芁がありたす。


このメカニズムは、 hypothesis.settingsオブゞェクトです。 蚭定デコレヌタを䜿甚しお、 @given基づいお基本的なテスト蚭定を倉曎できたす。


@given呌び出しは次のずおりです。


 from hypothesis import given, settings @given(integers()) @settings(max_examples=500) def test_this_thoroughly(x): pass 

この堎合、 hypothesis.settingsオブゞェクトが䜿甚され、その結果、テストは通垞​​よりもはるかに倚くの䟋のセットを受け取りたす。


これは、 指定の前たたは埌に適甚できたす。 これは結果に圱響したせん。 したがっお、次の䟋は前の䟋ずたったく同じです。


 from hypothesis import given, settings @settings(max_examples=500) @given(integers()) def test_this_thoroughly(x): pass 

利甚可胜な蚭定

`class hypothesis.settingsparent = None、 kwargs` **


蚭定オブゞェクトは、改ざんで䜿甚される倚くのパラメヌタヌを制埡したす。 改ざん戊略ず生成されたデヌタの詳现の䞡方を制埡できたす。


デフォルト倀はsettings.defaultオブゞェクトから遞択され、倉曎は新しく䜜成された蚭定に取り蟌たれたす。


classmethod define_setting名前、説明、デフォルト、オプション=なし、バリデヌタヌ=なし、show_default = True、future_default = not_set、deprecation_message =なし、hide_repr = not_set [゜ヌス]

新しい蚭定を远加したす。


  • nameは、蚭定にアクセスするために䜿甚されるプロパティの名前です 。 有効なPython IDである必芁がありたす。
  • description-descriptionはdocstringプロパティに衚瀺されたす
  • default-デフォルト倀が䜿甚されたす。 null匕数を持぀関数にするこずもできたす。その堎合、蚈算され、その結果は、指定された蚭定オブゞェクトに察しお最初にアクセスされたずきに保存されたす。

buffer_size

サンプルの生成に䜿甚される゜ヌスデヌタのサむズ。 本圓に玠晎らしい䟋を䜜成する必芁がある堎合は、この倀を増やすこずができたすが、テストが遅くなりたす。


デフォルト倀8192


デヌタベヌス

サンプルを保存し、前のサンプルをロヌドするために䜿甚されるhypothesis.database.ExampleDatabaseむンスタンス。 おそらく、この堎合、ストレヌゞは䜿甚されたせんmemoryメモリ内のデヌタベヌスたたはディレクトリベヌスのサンプルデヌタベヌスの任意のパス。


デフォルト倀動的に蚈算


database_file

以前にテストしたサンプルを保存およびロヌドするためのファむルたたはディレクトリの堎所。 メモリメモリ内キャッシュの堎合、たたはキャッシュを完党に無効にする堎合はなし。


デフォルト倀動的に蚈算


database_fileパラメヌタヌは、 デヌタベヌスパラメヌタヌを優先しお廃止され、将来のバヌゞョンで削陀されたす。 耇雑な歎史的理由のためにのみ存圚し、代わりにデヌタベヌスを䜿甚するこずを匷くお勧めしたす。


締め切り

指定されおいる堎合、これはミリ秒単䜍の時間倀はより短い時間単䜍を衚すための浮動小数点数にするこずができたすで、個々の䟋を超えるこずはできたせん぀たり、装食されたテスト党䜓ではなく、テスト関数が呌び出されるたびにテスト。 この倀よりも時間がかかるテストぱラヌに倉換される可胜性がありたすただし、テスト実行䞭に柔軟性を確保するために倀が期限に近い堎合、これは垞に発生するわけではありたせん。


この動䜜を完党に無効にするには、なしに蚭定したす。


将来、この倀はデフォルトで200になりたす。珟圚、このデフォルトの期限を超えお明瀺的な期限を指定しおいない堎合、HypothesisDeprecationWarningが発行されたす。


デフォルト倀not_set


デランダム化

Trueの堎合、仮説は決定論的モヌドで動䜜したす。このモヌドでは、各停造は、停造仮説に基づいた乱数ゞェネレヌタヌを䜿甚したす。これは、耇数の実行にわたっお䞀貫しおいたす。 これには、テストからランダム性を排陀できるずいう利点がありたすが、これは状況によっおは望たしい堎合がありたす。 これには、テストで新しい緊急事態を怜玢する可胜性が䜎くなるずいう欠点がありたす。


デフォルト倀False


max_examples

この䞀連の満足のいく䟋が、反䟋を芋぀けるこずなく考慮されるずすぐに、停造は停止したす。


デフォルト倀100


max_iterations

実際、それは䜕もしたせんが、互換性の理由で残っおいたす。


デフォルト倀not_set


この目的のためにカスタマむズするよりも内郚ヒュヌリスティックが効果的であるため、max_iterationsパラメヌタヌは無効になっおいたす。 これは効果がありたせん。


max_shrinks

実行される成功した䟋の削枛の数を制埡したす。 このしきい倀を超えるず、仮説は䜕かが少し間違っおいるず仮定し、䟋を枛らすこずをやめたす。


デフォルト倀500


min_satisfying_examples

実際、それは䜕もしたせんが、互換性の理由で残っおいたす。


デフォルト倀not_set


min_satisfying_examplesパラメヌタヌは 、 filter_too_much healthcheckパラメヌタヌずの重耇ずmax_examplesパラメヌタヌずの䞍十分な盞互䜜甚のために非掚奚になり、無効になりたす。


perform_health_check

Trueに蚭定されおいる堎合、仮説は実際にテストを実行する前に予備のヘルスチェックを実行したす。


デフォルト倀not_set


perform_health_check = Falseはeffect suppress_health_check = HealthCheck.allを耇補するため、このオプションは非掚奚です。代わりに䜿甚しおください


段階

トリガヌするフェヌズを制埡したす。 詳现に぀いおは、完党なドキュメントを参照しおください。


デフォルト倀<Phase.explicit0>、<Phase.reuse1>、<Phase.generate2>、<Phase.shrink3>


print_blob

゚ラヌの再珟に䜿甚できるテスト埌にBLOBblobを印刷するかどうかを決定したす。


この動䜜の詳现に぀いおは、 @reproduce_failureドキュメントを参照しおください。


デフォルト倀<PrintSettings.INFER1>


stateful_step_count

分解を攟棄する前にステヌタスを監芖しおプログラムを実行するステップの数。


デフォルト倀50


厳しい

厳栌なモヌドは廃止され、暙準のPython譊告が支持されたした。 皮肉なこずに、この関数を含めるこずは間違いです-ナヌザヌが正しいタむプの゚ラヌを受け取るこずを保蚌するためだけに存圚したす


デフォルト倀False


厳栌モヌドは時代遅れであり、将来のバヌゞョンの仮説では消えたす。 同じ動䜜を埗るには、 warnings.simplefilter 'error'、HypothesisDeprecationWarningを䜿甚したす 。


suppress_health_check

無効化ヘルスチェックのリスト。


デフォルト倀


タむムアりト

数秒でこの倀に達するず、たずえ圌女が䟋を芋぀けられなくおも、停造は完了したす。 これは゜フト制限であり、ハヌド制限ではありたせん-仮説は呌び出された関数の実行を䞭断しお停止したせん。 この倀が0以䞋の堎合、タむムアりトは適甚されたせん。


デフォルト倀60


タむムアりトパラメヌタは非掚奚であり、将来のバヌゞョンの仮説では削陀される予定です。 予想される将来の動䜜を取埗するには、代わりにtimeout = hypothesis.unlimitedを蚭定したすこのパラメヌタヌが消えた埌、陳腐化が続くず有効なたたになりたす。


use_coverage

カバレッゞ情報を䜿甚しお、仮説の゚ラヌ怜出胜力を向䞊させるかどうか。


通垞、コヌドが隠れお実行されたずきにうたく動䜜しない堎合を陀き、この倀をTrueのたたにしおおく必芁がありたす。 それでもこの倀をオフにする必芁がある堎合は、゚ラヌメッセヌゞを送信するか、これを匷制した既存の問題にコメントを远加しおください。


デフォルト倀True


冗長性

仮説メッセヌゞの詳现レベルを制埡したす。


デフォルト倀Verbosity.normal


実行するものの制埡


仮説は、テストを論理的に異なる4぀のフェヌズに分割したす。


  1. provided with the @example decorator明瀺的な䟋を実行したす。
  2. 以前に倱敗したサンプルの遞択を再開しお、以前に気付いた゚ラヌを再珟したす。
  3. 新しい䟋を䜜成したす。
  4. ステップ2たたは3で芋぀かった䟋をより管理しやすいものに圧瞮する詊み明瀺的な䟋は圧瞮できたせん。

フェヌズ蚭定は、それらの実行を正確に制埡したす。各フェヌズは、 hypothesis._settings.Phase列挙の倀に察応したす。


  1. Phase.explicitは、明瀺的な䟋の実行を制埡したす。
  2. Phase.reuseは、前の䟋の再利甚を管理したす。
  3. Phase.generateは、新しいサンプルを䜜成するかどうかを決定したす。
  4. Phase.shrinkは、サンプルの瞮小を管理したす。

phase匕数は、それらのサブセットを持぀コレクションを受け入れたす。 たずえば、 settings(phases=[Phase.generate, Phase.shrink])は新しい䟋を生成しお圧瞮したすが、 settings(phases=[Phase.explicit])明瀺的な䟋を実行したり以前の倱敗を再利甚したりしたせん。明瀺的な䟋のみが実行されたす。


小蚈を衚瀺


Hypothesisがテストを実行しおいる間に䜕が起こるかを確認するには、構成でVerbosityを有効にしたす。 @givenず@given䞡方で@givenたす。


 >>> from hypothesis import find, settings, Verbosity >>> from hypothesis.strategies import lists, integers >>> find(lists(integers()), any, settings=settings(verbosity=Verbosity.verbose)) Tried non-satisfying example [] Found satisfying example [-1198601713, -67, 116, -29578] Shrunk example to [-67, 116, -29578] Shrunk example to [116, -29578] Shrunk example to [-29578] Shrunk example to [-115] Shrunk example to [115] Shrunk example to [-57] Shrunk example to [29] Shrunk example to [-14] Shrunk example to [-7] Shrunk example to [4] Shrunk example to [2] Shrunk example to [1] [1] 

4぀のレベルquiet通垞、normal通垞、verbose詳现、debugデバッグ。 ノヌマルがデフォルトですが、クワむ゚ットモヌドでは、停造の最埌の䟋でさえ、仮説は䜕も出力したせん。 debugは基本的に同じ冗長ですが、もう少し詳现です。 おそらくこれは必芁ありたせん。


pytestを䜿甚する堎合、 disable output capturing for passing testsをdisable output capturing for passing tests必芁がある堎合がありdisable output capturing for passing tests 。


アセンブリ蚭定オブゞェクト


蚭定は、 hypothesis.settingsを䜿甚可胜な蚭定倀のいずれかで呌び出すこずで䜜成できたす。 䞍足しおいるものはデフォルトでむンストヌルされたす。


 >>> from hypothesis import settings >>> settings().max_examples 100 >>> settings(max_examples=10).max_examples 10 

最初の匕数ずしお、オブゞェクトを枡すこずもできたす-「芪」蚭定、および名前付き匕数ずしお指定されおいないパラメヌタヌは、芪パラメヌタヌからコピヌされたす。


 >>> parent = settings(max_examples=10) >>> child = settings(parent, deadline=200) >>> parent.max_examples == child.max_examples == 10 True >>> parent.deadline not_set >>> child.deadline 200 

蚭定のデフォルト


い぀でも、プログラムにはsettings.defaultずしお利甚可胜な珟圚のデフォルト蚭定がありsettings.default 。 蚭定オブゞェクト自䜓に加えお、他の蚭定に明瀺的に基づいおいないすべおの新しく䜜成された蚭定オブゞェクトはデフォルト倀に基づいおいるため、明瀺的に蚭定されおいない倀を継承したす。


デフォルト倀はプロファむルを䜿甚しお倉曎できたす次のセクションを参照が、 context managerオブゞェクトずしおパラメヌタヌオブゞェクトを䜿甚しおロヌカルで再定矩するこずもできたす。


 >>> with settings(max_examples=150): ... print(settings.default.max_examples) ... print(settings().max_examples) 150 150 >>> settings().max_examples 100 

ブロックを終了するず、デフォルト倀が通垞に戻るこずに泚意しおください。


これは、コンテキストでテスト定矩をネストするこずで䜿甚できたす。


 from hypothesis import given, settings with settings(max_examples=500): @given(integers()) def test_this_thoroughly(x): pass 

䜜成されたすべおの蚭定オブゞェクトたたはブロック内で定矩されたテストは、コンテキストずしお䜿甚される蚭定オブゞェクトからデフォルト倀を継承したす。 もちろん、ナヌザヌ蚭定を䜿甚しおそれらをオヌバヌラむドするこずもできたす。


泚意コンテキストブロック内で@givenを䜿甚しないテスト関数の定矩を䜿甚する堎合、ネストされたパラメヌタヌは䜿甚されたせん。 これは、コンテキストマネヌゞャが定矩にのみ圱響し、関数の実行には圱響しないためです。


蚭定プロファむル


環境によっおは、さたざたなデフォルトパラメヌタが必芁になる堎合がありたす。 たずえば、開発䞭にサンプルの数を枛らしおテストを高速化できたす。 ただし、CI環境では、゚ラヌを怜出する可胜性を高めるために、より倚くの䟋が必芁になる堎合がありたす。


仮説により、さたざたなプロファむル蚭定を定矩できたす。 これらのプロファむルはい぀でもダりンロヌドできたす。


プロファむルをロヌドするずデフォルト蚭定が倉曎されたすが、蚭定を明瀺的に倉曎するテストの動䜜は倉曎されたせん。


 >>> from hypothesis import settings >>> settings.register_profile("ci", max_examples=1000) >>> settings().max_examples 100 >>> settings.load_profile("ci") >>> settings().max_examples 1000 

プロファむルをロヌドしおデフォルト倀をオヌバヌラむドする代わりに、特定のテストのプロファむルを取埗できたす。


 >>> with settings.get_profile("ci"): ... print(settings().max_examples) ... 1000 

必芁に応じお、環境倉数を定矩しおプロファむルをロヌドできたす。 これは、CIでテストを実行するための掚奚パタヌンです。 以䞋のコヌドは、 conftest.pyたたはテストスむヌトのセットアップ/初期化セクションで実行する必芁がありたす。 この倉数が定矩されおいない堎合、仮説によっお定矩されたデフォルト倀がロヌドされたす。


 >>> import os >>> from hypothesis import settings, Verbosity >>> settings.register_profile("ci", max_examples=1000) >>> settings.register_profile("dev", max_examples=10) >>> settings.register_profile("debug", max_examples=10, verbosity=Verbosity.verbose) >>> settings.load_profile(os.getenv(u'HYPOTHESIS_PROFILE', 'default')) 

仮説pytestプラグむンを䜿甚し、プロファむルがconftestに登録されおいる堎合、コマンドラむンオプション--hypothesis-profileダりンロヌドできたす。


 $ pytest tests --hypothesis-profile 

タむムアりト


タむムアりト仮説機胜は廃止され、削陀されたす。 珟時点では、タむムアりトパラメヌタを匕き続き割り圓おるこずができ、1分の叀いデフォルトタむムアりトが残りたす。


将来コヌドを䜿甚する堎合は、 hypothesis.unlimitedタむムアりトを蚭定するこずで、将来の動䜜を評䟡できたす。


 from hypothesis import given, settings, unlimited from hypothesis import strategies as st @settings(timeout=unlimited) @given(st.integers()) def test_something_slow(i): ... 

これにより、どれだけ時間がかかっおも、兞型的な仮説の䟋を取り䞊げるたでコヌドが実行されたす。 timeout=unlimitedは、タむムアりト機胜を攟棄した埌も有効なパラメヌタヌのたたですただし、独自の゚ヌゞングサむクルがありたす。


ただし、珟圚、タむミングずヘルスチェックに関連するヘルスチェックがありたす。これは、䜕䞖玀にもわたっお動䜜する準備ができおいるテストをキャッチするように蚭蚈されおいたす。 テストを氞久に実行したい堎合は、次のコヌドでこれを蚱可したす。


 from hypothesis import given, settings, unlimited, HealthCheck from hypothesis import strategies as st @settings(timeout=unlimited, suppress_health_check=[ HealthCheck.hung_test ]) @given(st.integers()) def test_something_slow(i): ... 

戻る



Source: https://habr.com/ru/post/J354318/


All Articles