我正在使用Hypothesis庫進行單元測驗。使用此庫,您無需手動選擇輸入,而是定義要測驗的完整輸入集。然后假設將從該集合中采樣以查找破壞函式的輸入。這也稱為基于屬性的測驗。在假設中,這些集合稱為策略。
現在我想對一個驗證某些輸入的函式進行單元測驗:
GRIDSIZE_FORMAT = "^[0-9] x[0-9] $"
CELL_FORMAT = "^[A-Z] [0-9] $"
def _validate(gridsize, walls, entrance):
if not re.match(GRIDSIZE_FORMAT, gridsize):
raise ValueError(f"grid size '{gridsize}' does not match format '{GRIDSIZE_FORMAT}'")
for wall in walls:
if not re.match(CELL_FORMAT, walls):
raise ValueError(f"wall '{wall}' does not match format '{CELL_FORMAT}'")
if not re.match(CELL_FORMAT, entrance):
raise ValueError(f"entrance '{entrance}' does not match format '{CELL_FORMAT}'")
為了正確測驗這個函式,我想生成“除了 X 之外的任何東西”形式的示例,X 是這個函式的正確輸入格式。
假設庫中是否有可以生成這樣的輸入的策略?
uj5u.com熱心網友回復:
不幸的是,Hypothesis 無法計算策略的補碼,因為策略可以由用戶提供的任意代碼(包括副作用!)組成。例如,將是 的補集hypothesis.extra.django.from_model(User),它將生成的實體插入資料庫?(無效,不在資料庫中,...)
在更具體的情況下,您可以取而代之采用規范的補充,然后從該補充中匯出策略。您的正則運算式技巧就是一個很好的例子 - 顯式集合補碼往往比天真的“生成正確的東西,并過濾掉有效實體”的方法更有效。
uj5u.com熱心網友回復:
我確實找到了一種使用正則運算式的方法:
from hypothesis import strategies as st
not_cellpattern = st.from_regex(f'(?!{CELL_FORMAT})')
@given(
gridsize = st.from_regex(f'(?!{GRIDSIZE_FORMAT})'),
walls = st.lists(not_cellpattern),
entrance = not_cellpattern
)
def test_validate(gridsize, walls, entrance):
try:
_validate(gridsize, walls, entrance)
except ValueError:
pass
else:
raise Exception(f"_validate did not catch faulty input '{gridsize}', '{walls}', '{entrance}'")
但這并不完全正確:因為 1)我必須將自己限制在字串中,并且 2)這只測驗所有三個輸入都錯誤的情況,而不僅僅是其中一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/460514.html
上一篇:在單元測驗中模擬Glide以避免NullPointerException
下一篇:php中的addItem單元測驗
