摘要:最近筆者在寫完智能合約,想要寫一些測試案例,但是自帶的單元測試用起來不是很方便。是基于的智能合約測試框架,它的實現方式其實就是去調用來與端進行交互,利用的單元測試工具來做測試,的使用讀者可以自行去了解哈,這里筆者就不贅述了。
最近筆者在寫完智能合約,想要寫一些測試案例,但是 eos 自帶的單元測試用起來不是很方便。平常用 cleos 測試的體驗感其實挺不錯,所以筆者設想有一種是用 cleos 作為與 nodeos 端互動的測試框架,去 github 上找了找, 還真有。https://github.com/tokenika/e... 。 基本能滿足大致的需求,但還不是很完善,例如筆者需要用到其他索引,不只是主鍵索引,但是該測試框架不支持,所以做些了改動,已經提交PR, 還有其他一些小細節,讀者可以考慮從我先使用我改動的版本: https://github.com/superoneio...
安裝步驟 1.首先 裝完 python 3.6 版本的環境,git clone url, 將代碼拉取到本地。 2.執行 install.sh 腳本。填入 eosio 源碼目錄,以及智能合約目錄就行了。
本章以 dice 合約作為例子來介紹 eosfactory 在本地測試環境的使用。
eosfactory 是基于 python 的 EOS 智能合約測試框架,它的實現方式其實就是 python 去調用 cleos 來與 nodeos 端進行交互,利用 python 的 unittest 單元測試工具來做測試,unittest 的使用讀者可以自行去了解哈,這里筆者就不贅述了。
測試智能合約所需要的幾個基本功能:創建賬號,執行action, 查看數據表。下面我們通過 dice 合約的單元測試代碼來了解這一系列操作。
進行本地環境的初始化操作
# 重置鏈,即 delete-all-blocks reset() # 首先獲取 eosio 賬號的,這里的 master 指向的就是 eosio 賬號。 create_master_account("master”); system_contract_path = "/Users/wuyuan/Documents/study/eos/build/contracts/“ # 創建系統賬號 create_account("et",master,"eosio.token") create_account("em",master,"eosio.msig") create_account("er",master,"eosio.ram") create_account("erf",master,"eosio.ramfee") create_account("es",master,"eosio.stake”) # 部署 token 和 msig 合約 et_contract = Contract(et,system_contract_path + "eosio.token","eosio.token.abi","eosio.token.wasm") et_contract.deploy(); em_contract = Contract(em,system_contract_path + "eosio.msig","eosio.msig.abi","eosio.msig.wasm") em_contract.deploy(); // 創建 EOS 代幣 et.push_action("create",{"issuer":"eosio","maximum_supply":"100000000000.0000 EOS"},permission=(et,Permission.ACTIVE)) et.push_action("issue",{"to":"eosio","quantity":"100000000.0000 EOS","memo":"haha"},permission=(master,Permission.ACTIVE)) # 部署系統合約 contract = Contract(master,"/Users/wuyuan/Documents/study/eos/build/contracts/eosio.system","eosio.system.abi","eosio.system.wasm”) contract.deploy() # 創建 dice 合約需要的賬號 create_account("dice",master,"dice","","","1000","1000",None,"10000") create_account("alice",master,"alice","","","1000","1000",None,"1000") create_account("bob",master,"bob","","","1000","1000",None,"1000") # 賦予代幣 et.push_action("transfer",{"from":"eosio","to":"alice","quantity":"10000.0000 EOS","memo":"hi"},permission=("eosio",Permission.ACTIVE)) et.push_action("transfer",{"from":"eosio","to":"bob","quantity":"10000.0000 EOS","memo":"hi"},permission=("eosio",Permission.ACTIVE))
環境的初始化已經完成了,接下來部署 dice 合約以及進行游戲操作。
# init dice contract self.deploy_contract() # 將 alice 和 bob 賬號的 eosio.code 權限付給 dice 賬號 self.updateauth(alice.name) self.updateauth(bob.name) # 充值游戲幣 self.deposit(alice.name,"100.0000 EOS") self.deposit(bob.name,"100.0000 EOS”) # 獲取 account 表信息。 account = self.get_account() print(account) # 開始游戲 source1 = "28349b1d4bcdc9905e4ef9719019e55743c84efa0c5e9a0b077f0b54fcd84905" commitment1 = "d533f24d6f28ddcef3f066474f7b8355383e485681ba8e793e037f5cf36e4883" source2 = "15fe76d25e124b08feb835f12e00a879bd15666a33786e64b655891fba7d6c12" commitment2 = "50ed53fcdaf27f88d51ea4e835b1055efe779bb87e6cfdff47d28c88ffb27129" self.offerbet("3.0000 EOS",alice.name,commitment1) offer = self.get_offer_by_commitment(commitment1) print(offer) self.offerbet("3.0000 EOS",bob.name,commitment2) offer2 = self.get_offer_by_commitment(commitment2) print(offer2) game = self.get_game_by_id(offer2["gameid"]) print(game) self.reveal(commitment1,source1,alice.name) game = self.get_game_by_id(offer2["gameid"]) print(game) self.reveal(commitment2,source2,bob.name) # 查看 account 表信息,看看是否贏了錢 account = self.get_account() print(account) # show global value print(self.get_global_dice())
OK ,上面說了獲取表信息,接下來介紹如何獲取表數據
# account_object 賬戶類,無需傳入, table_name 表名, scope , binary 是否顯示二進制數據, limit 篩選條數, key 目前無作用, lower 篩選下限,upper 篩選上限, index 索引名 默認主鍵, key_type 索引類型 table(account_object, table_name, scope="", binary=False, limit=10, key="", lower="", upper="",index="first",key_type="i64") 1.直接獲取, table( [ 表名 ],[ scope ],[ 條數,默認為10 ]) def get_account(self): try: account = dice.table("account”,dice.name,100).json["rows"] return account except errors.Error as e: print("except errors.Error as e: ",e) return None 2.通過 lower_bound 和主鍵索引篩選 def get_offer_by_id(self, id): try: offer = dice.table("offer",dice.name,False,1,"",id).json["rows"] if len(offer) != 0: self.assertEqual( offer[0]["id"] , id, "not this game id") return offer[0] except errors.Error as e: print("except errors.Error as e: ",e) return None 3.通過 lower_bound 和 非主鍵索引篩選 def get_offer_by_commitment(self, commitment): try: # ter 表示 第三個索引 索引類型為 sha256 offer = dice.table("offer",dice.name,False,1,"",commitment,"","ter","sha256").json["rows"] if len(offer) != 0: self.assertEqual( offer[0]["commitment"] , commitment, "not this game id") return offer[0] except errors.Error as e: print("except errors.Error as e: ",e) return None
從代碼我們可以看出,其實就是跟我們平時用 cleos 差不多,只是它將其封裝起來供我們調用,這樣可以節約我們不少時間,也方便我們調試,寫自動化測試腳本。
文中的例子: https://github.com/superoneio...
大家如果以后遇到更好用的測試框架,請務必介紹給我哈。
轉載請注明來源: https://eos.live/detail/17418
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44989.html
摘要:最近筆者在寫完智能合約,想要寫一些測試案例,但是自帶的單元測試用起來不是很方便。是基于的智能合約測試框架,它的實現方式其實就是去調用來與端進行交互,利用的單元測試工具來做測試,的使用讀者可以自行去了解哈,這里筆者就不贅述了。 最近筆者在寫完智能合約,想要寫一些測試案例,但是 eos 自帶的單元測試用起來不是很方便。平常用 cleos 測試的體驗感其實挺不錯,所以筆者設想有一種是用 cl...
摘要:以太坊背后的主要人物是。以太坊通過在區塊鏈上引入智能合約,徹底改變了加密世界。以太坊使用名為以太坊虛擬機的虛擬機執行其智能合約。以太坊最終將利用協議轉向權益證明。截至目前,以太坊在可擴展性方面都失敗了。 不同的區塊鏈智能合約和區塊鏈技術現在風靡一時。越來越多的人出于某種原因試圖進入這個神奇的世界。如果你是這項技術的新手并正在尋找基于區塊鏈的開發平臺的快速入門,那么本指南非常適合你。我們...
摘要:多索引數據庫是中的一種數據結構,它根據范圍的定義方式提供存儲數據的靈活性。例如,每個帳戶已存儲在合約中定義的多索引數據庫中的數,該合約由定義范圍的每個帳戶的一小塊組成。 對于EOS RAM的來說什么最重要呢?我們經常在每天的數字貨幣和區塊鏈相關新聞中看到EOS旁邊的RAM這個詞,但是無論如何我們應該關注它的價格,為什么要關注它的價格,即使是那些只想深入了解智能合約開發的人也需要這樣嗎?...
摘要:在看啟動腳本輸出的時候,發現了這兩樣輸出設置和智能合約,以及安裝合約開發工具。合約開發工具是的工具鏈和一組工具,用于促進平臺的合同編寫。系統智能合約,可以進行很多系統級別的操作,比如用戶投票將用戶注冊成為生產者。 Previously 在EOS DApp開發入門(一)中,通過docker image的方式架起了本地的eos區塊鏈,使Note chain DApp與本地區塊鏈進行交互,成...
閱讀 2561·2023-04-25 18:13
閱讀 770·2021-11-22 12:10
閱讀 2969·2021-11-22 11:57
閱讀 2138·2021-11-19 11:26
閱讀 2164·2021-09-22 15:40
閱讀 1460·2021-09-03 10:28
閱讀 2704·2019-08-30 15:53
閱讀 1950·2019-08-30 15:44