Lição 4

合約測試

歡迎繼續Tezos上的代幣化第四課的學習!在本節中,我們將探討開髮過程中詳盡的測試的重要性,以及如何使用智能合約中提供的測試包來執行這些測試。我們仍將使用SmartPy在線IDE作爲開髮環境,併在運行合約後打開界麵。

引言

智能合約一旦部署在區塊鏈上,將無法更改。因此,任何錯誤或安全漏洞都可能産生嚴重後果,測試便成爲開髮過程中不可或缺的一環。

在本節中,我們將介紹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。如果合約能成功阻止轉移,則測試通過。

總結

測試在智能合約開髮中至關重要。鑒於區塊鏈的不可篡改性,合約中的任何錯誤都可能産生永久性、高成本的後果。編寫全麵的測試可確保所有功能按預期運行,使合約安全、強大。

需要記住的是,一定要衕時爲正曏和負曏情況編寫測試。正曏情況驗證函數在按預期使用時是否正常工作。負曏情況確保合約在處理不正確或意外輸入時能夠正確運行。

Isenção de responsabilidade
* O investimento em criptomoedas envolve grandes riscos. Prossiga com cautela. O curso não se destina a servir de orientação para investimentos.
* O curso foi criado pelo autor que entrou para o Gate Learn. As opiniões compartilhadas pelo autor não representam o Gate Learn.
Catálogo
Lição 4

合約測試

歡迎繼續Tezos上的代幣化第四課的學習!在本節中,我們將探討開髮過程中詳盡的測試的重要性,以及如何使用智能合約中提供的測試包來執行這些測試。我們仍將使用SmartPy在線IDE作爲開髮環境,併在運行合約後打開界麵。

引言

智能合約一旦部署在區塊鏈上,將無法更改。因此,任何錯誤或安全漏洞都可能産生嚴重後果,測試便成爲開髮過程中不可或缺的一環。

在本節中,我們將介紹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。如果合約能成功阻止轉移,則測試通過。

總結

測試在智能合約開髮中至關重要。鑒於區塊鏈的不可篡改性,合約中的任何錯誤都可能産生永久性、高成本的後果。編寫全麵的測試可確保所有功能按預期運行,使合約安全、強大。

需要記住的是,一定要衕時爲正曏和負曏情況編寫測試。正曏情況驗證函數在按預期使用時是否正常工作。負曏情況確保合約在處理不正確或意外輸入時能夠正確運行。

Isenção de responsabilidade
* O investimento em criptomoedas envolve grandes riscos. Prossiga com cautela. O curso não se destina a servir de orientação para investimentos.
* O curso foi criado pelo autor que entrou para o Gate Learn. As opiniões compartilhadas pelo autor não representam o Gate Learn.