èšå®
ãã®èšäºã¯ãå
¬åŒããã¥ã¢ã«ããåŒçšãã 仮説èšå®ããŒãžã®ç¿»èš³ã§ã ã
*泚 翻蚳è
ïŒ*å人çã«ã¯ã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ã€ã®ãã§ãŒãºã«åå²ããŸãã
provided with the @example decorator
æç€ºçãªäŸãå®è¡ããŸãã- 以åã«å€±æãããµã³ãã«ã®éžæãåéããŠã以åã«æ°ä»ãããšã©ãŒãåçŸããŸãã
- æ°ããäŸãäœæããŸãã
- ã¹ããã2ãŸãã¯3ã§èŠã€ãã£ãäŸããã管çãããããã®ã«å§çž®ãã詊ã¿ïŒæç€ºçãªäŸã¯å§çž®ã§ããŸããïŒã
ãã§ãŒãºèšå®ã¯ããããã®å®è¡ãæ£ç¢ºã«å¶åŸ¡ããŸããåãã§ãŒãºã¯ã hypothesis._settings.Phase
åæã®å€ã«å¯Ÿå¿ããŸãã
Phase.explicit
ã¯ãæç€ºçãªäŸã®å®è¡ãå¶åŸ¡ããŸããPhase.reuse
ã¯ãåã®äŸã®åå©çšã管çããŸããPhase.generate
ã¯ãæ°ãããµã³ãã«ãäœæãããã©ãããæ±ºå®ããŸãã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
ã¿ã€ã ã¢ãŠã
ã¿ã€ã ã¢ãŠã仮説æ©èœã¯å»æ¢ãããåé€ãããŸãã çŸæç¹ã§ã¯ãã¿ã€ã ã¢ãŠããã©ã¡ãŒã¿ãåŒãç¶ãå²ãåœãŠãããšãã§ãã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): ...
æ»ã