Web3.py
布朗尼:假設給定()沒有為每個函式呼叫重置鏈
我的巧克力蛋糕項目中有以下測試程式碼片段:
from hypothesis import settings, given, strategies as st from brownie import * import brownie st_buy_amount_eth = st.integers(min_value=int(Wei("1 gwei")), max_value=int(Wei("10 ether"))) @given(buy_amount=st_buy_amount_eth) @settings(max_examples=20) def test_buy_lgt_atleast_for(lgt, accounts, buy_amount): print(web3.eth.blockNumber) token_amount = buy_amount_to_tokens(buy_amount) # hard-coded function to verify the math if token_amount >= 1: tx = lgt.buyLgtAtLeastFor(1, 99999999999, accounts[3], {'from': accounts[2], 'value': buy_amount}) assert tx.return_value == token_amount assert lgt.balanceOf(accounts[3]) == token_amount else: with brownie.reverts("dev: not enough eth to buy tokens"): liquidLgt.buyLgtAtLeast(1, 99999999999, {'from': accounts[2], 'value': buy_amount})
當使用列印輸出執行測試時,
brownie test -s
對於每個帶有假設的範例,我得到的結果要高一個塊,並且我從假設中得到不一致的結果錯誤。有沒有辦法設置它,所以假設會為每個範例正確重置鏈?那太棒了,我真的希望能得到與布朗尼一起工作的假設!
您需要
@given
從 Brownie 導入,而不是直接從假設導入:from brownie.test import given
這是必需的,因為 Brownie 通過夾具處理隔離,但功能範圍內的夾具每次測試僅執行一次(而不是每次執行一次)。從假設文件:
…每個夾具將為整個功能執行一次,而不是每個範例一次。
Brownie 通過將測試包裝在執行鏈倒帶的函式中解決了這個問題。您可以在原始碼中看到它在此處處理。