智能合約一旦部署在區塊鏈上,將無法更改。因此,任何錯誤或安全漏洞都可能産生嚴重後果,測試便成爲開髮過程中不可或缺的一環。
在本節中,我們將介紹Fa1_2TestFull
合約,其中包括一繫列旨在驗證代幣合約功能的測試。
Fa1_2TestFull
合約Fa1_2TestFull
合約整合了不衕合約的所有功能,包括管理員、暫停、Fa1_2、鑄幣、銷毀和更改元數據。該合約將所有這些功能結合起來併執行詳盡的測試,以確保合約按預期工作。
Python
class Fa1_2TestFull(Admin, Pause, Fa1_2, Mint, Burn, ChangeMetadata):
def __init__(self, administrator, metadata, ledger, token_metadata):
ChangeMetadata.__init__(self)
Burn.__init__(self)
Mint.__init__(self)
Fa1_2.__init__(self, metadata, ledger, token_metadata)
Pause.__init__(self)
Admin.__init__(self, administrator)
Fa1_2TestFull
類構造函數將所有功能初始化。
我們首先爲測試帳戶和合約初始化設置測試場景。我們將通過用@sp.add_test
修飾的測試函數來完成。
Python
@sp.add_test(name="FA12")def test():
# Initialize test scenario and accounts
sc = sp.test_scenario(m)
admin = sp.test_account("Administrator")
alice = sp.test_account("Alice")
bob = sp.test_account("Robert")
# Initialize contract with some initial values
token_metadata = {
"decimals": sp.utils.bytes_of_string("18"), # Mandatory by the spec"name": sp.utils.bytes_of_string("My Great Token"), # Recommended"symbol": sp.utils.bytes_of_string("MGT"), # Recommended# Extra fields"icon": sp.utils.bytes_of_string("https://smartpy.io/static/img/logo-only.svg"),
}
contract_metadata = sp.utils.metadata_of_url("ipfs://QmaiAUj1FFNGYTu8rLBjc3eeN9cSKwaF8EGMBNDmhzPNFd")
c1 = m.Fa1_2TestFull(administrator=admin.address,metadata=contract_metadata,token_metadata=token_metadata,ledger={},)
sc += c1
我們首先定義三個測試帳戶:Admin、Alice和Bob,然後用一些初始值對合約Fa1_2TestFull
進行初始化。+=
運算符會將合約添加到場景中。
爲了讓大家更好地理解代碼,我們將在左側展示代碼,在右側展示高亮部分代碼的可視化,詳見下圖:
接下來便是運行測試,這將觸髮不衕的合約函數併驗證結果。
例如,要測試鑄幣功能,我們將運行以下代碼:
Python
sc.h2("Admin mints a few coins")
c1.mint(address=alice.address, value=12).run(sender=admin)
此行代碼運行了以下測試:管理員爲Alice鑄造12個代幣。如果該函數成功鑄造了代幣併正確更新了Alice的餘額,則此測試通過。
SmartPy提供了verify
函數來確保條件成立。如果條件不滿足,則測試失敗。例如:
Python
c1.update_metadata(key="", value=sp.bytes("0x00")).run(sender=admin)
sc.verify(c1.data.metadata[""] == sp.bytes("0x00"))
以上代碼驗證合約的元數據是否正確更新爲"0x00"
。若未正確更新,則測試失敗。
您的智能合約測試應涵蓋所有可能的用例,包括邊緣情況和潛在故障,如超過用戶餘額的轉賬、合約暫停期間銷毀代幣等。
例如,失敗的轉賬測試可能如下:
Python
sc.h2("Bob tries to transfer from Alice but he doesn't have her approval")
c1.transfer(from_=alice.address, to_=bob.address, value=4).run(sender=bob, valid=False)
這裡,Bob試圖在未經批準的情況下從Alice的賬戶中轉移4個代幣。由於此操作會失敗,我們在run
函數中設置valid=False
。如果合約能成功阻止轉移,則測試通過。
測試在智能合約開髮中至關重要。鑒於區塊鏈的不可篡改性,合約中的任何錯誤都可能産生永久性、高成本的後果。編寫全麵的測試可確保所有功能按預期運行,使合約安全、強大。
需要記住的是,一定要衕時爲正曏和負曏情況編寫測試。正曏情況驗證函數在按預期使用時是否正常工作。負曏情況確保合約在處理不正確或意外輸入時能夠正確運行。
智能合約一旦部署在區塊鏈上,將無法更改。因此,任何錯誤或安全漏洞都可能産生嚴重後果,測試便成爲開髮過程中不可或缺的一環。
在本節中,我們將介紹Fa1_2TestFull
合約,其中包括一繫列旨在驗證代幣合約功能的測試。
Fa1_2TestFull
合約Fa1_2TestFull
合約整合了不衕合約的所有功能,包括管理員、暫停、Fa1_2、鑄幣、銷毀和更改元數據。該合約將所有這些功能結合起來併執行詳盡的測試,以確保合約按預期工作。
Python
class Fa1_2TestFull(Admin, Pause, Fa1_2, Mint, Burn, ChangeMetadata):
def __init__(self, administrator, metadata, ledger, token_metadata):
ChangeMetadata.__init__(self)
Burn.__init__(self)
Mint.__init__(self)
Fa1_2.__init__(self, metadata, ledger, token_metadata)
Pause.__init__(self)
Admin.__init__(self, administrator)
Fa1_2TestFull
類構造函數將所有功能初始化。
我們首先爲測試帳戶和合約初始化設置測試場景。我們將通過用@sp.add_test
修飾的測試函數來完成。
Python
@sp.add_test(name="FA12")def test():
# Initialize test scenario and accounts
sc = sp.test_scenario(m)
admin = sp.test_account("Administrator")
alice = sp.test_account("Alice")
bob = sp.test_account("Robert")
# Initialize contract with some initial values
token_metadata = {
"decimals": sp.utils.bytes_of_string("18"), # Mandatory by the spec"name": sp.utils.bytes_of_string("My Great Token"), # Recommended"symbol": sp.utils.bytes_of_string("MGT"), # Recommended# Extra fields"icon": sp.utils.bytes_of_string("https://smartpy.io/static/img/logo-only.svg"),
}
contract_metadata = sp.utils.metadata_of_url("ipfs://QmaiAUj1FFNGYTu8rLBjc3eeN9cSKwaF8EGMBNDmhzPNFd")
c1 = m.Fa1_2TestFull(administrator=admin.address,metadata=contract_metadata,token_metadata=token_metadata,ledger={},)
sc += c1
我們首先定義三個測試帳戶:Admin、Alice和Bob,然後用一些初始值對合約Fa1_2TestFull
進行初始化。+=
運算符會將合約添加到場景中。
爲了讓大家更好地理解代碼,我們將在左側展示代碼,在右側展示高亮部分代碼的可視化,詳見下圖:
接下來便是運行測試,這將觸髮不衕的合約函數併驗證結果。
例如,要測試鑄幣功能,我們將運行以下代碼:
Python
sc.h2("Admin mints a few coins")
c1.mint(address=alice.address, value=12).run(sender=admin)
此行代碼運行了以下測試:管理員爲Alice鑄造12個代幣。如果該函數成功鑄造了代幣併正確更新了Alice的餘額,則此測試通過。
SmartPy提供了verify
函數來確保條件成立。如果條件不滿足,則測試失敗。例如:
Python
c1.update_metadata(key="", value=sp.bytes("0x00")).run(sender=admin)
sc.verify(c1.data.metadata[""] == sp.bytes("0x00"))
以上代碼驗證合約的元數據是否正確更新爲"0x00"
。若未正確更新,則測試失敗。
您的智能合約測試應涵蓋所有可能的用例,包括邊緣情況和潛在故障,如超過用戶餘額的轉賬、合約暫停期間銷毀代幣等。
例如,失敗的轉賬測試可能如下:
Python
sc.h2("Bob tries to transfer from Alice but he doesn't have her approval")
c1.transfer(from_=alice.address, to_=bob.address, value=4).run(sender=bob, valid=False)
這裡,Bob試圖在未經批準的情況下從Alice的賬戶中轉移4個代幣。由於此操作會失敗,我們在run
函數中設置valid=False
。如果合約能成功阻止轉移,則測試通過。
測試在智能合約開髮中至關重要。鑒於區塊鏈的不可篡改性,合約中的任何錯誤都可能産生永久性、高成本的後果。編寫全麵的測試可確保所有功能按預期運行,使合約安全、強大。
需要記住的是,一定要衕時爲正曏和負曏情況編寫測試。正曏情況驗證函數在按預期使用時是否正常工作。負曏情況確保合約在處理不正確或意外輸入時能夠正確運行。