在fabric開發中,chaincode的測試是一個令人比較頭疼的問題,一是由于實際情況中chaincode中的存儲和查詢是依賴于peer節點上的狀态資料庫的,是以無法在本地直接測試;二是由于chaincode是運作于容器中的,這導緻我們很難擷取在代碼中列印的日志。
如果直接在實際開發環境中測試chaincode就更麻煩了,每一次調試都需要重新開機整個網絡(有可能還是多機部署的),并且要建立和加入通道,安裝以及執行個體化鍊碼,這嚴重影響了測試的效率。下面介紹兩種測試鍊碼的手段,一種是開發者 (dev) 模式,在本地單機搭建一個簡單的網絡來進行測試;另一種是單元測試 (UT),可以無需啟動節點環境,自動化測試所有接口。
開發者模式
環境分析
使用開發者調試環境,需要先下載下傳
fabric-samples
,置于
$GOPATH/src
下。開發者調試目錄位于:
fabric-samples/chaincode-docker-devmode
首先分析一下目錄中的
docker-compose-simple.yaml
檔案:
該網絡中包含1個orderer節點,1個peer節點,1個chaincode容器(負責運作我們要測試的鍊碼),1個cli容器(負責發送請求來測試鍊碼)。
有兩點需要注意的:
- 在cli容器的
項中可以看見,啟動後會自動執行目前目錄下的command
腳本,該腳本會自動建立名為script.sh
的通道,并且将節點加入。是以我們隻需要安裝和執行個體化鍊碼即可。myc
- 在chaincode容器的
中可以看見這樣一條映射:volumes
說明- ./../chaincode:/opt/gopath/src/chaincode
目錄會映射到容器内部,這也是我們待測試鍊碼需要放置的地方。為了友善管理,我們可以在該目錄下為每個鍊碼再配置設定一個目錄,然後把要測試的鍊碼放在其中。(當然也可以直接修改映射指向自己chaincode的實際路徑)。fabric-samples/chaincode
測試過程
終端一:啟動網絡
首先進入開發者模式目錄:
cd fabric-samples/chaincode-docker-devmode
啟動網絡:
docker-compose -f docker-compose-simple.yaml up
當看到
Going to wait for newer blocks
時表示啟動成功,此時網絡中存在四個容器(1 orderer,1 peer, 1 chaincode, 1 cli),建立了通道myc并将peer成功加入。
終端二:編譯鍊碼
進入chaincode容器
docker exec -it chaincode bash
編譯想要測試的chaincode:
cd sacc
go build
成功執行後單目前目錄下會出現生成的可執行檔案。此時需要啟動這個可執行檔案:
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc
注:這裡有個不解的小問題,官網教程中的端口是peer:7051,并且目前peer确實也在監聽7051,但是寫成7051就會報錯:
Error starting SimpleAsset chaincode: error sending chaincode REGISTER
。
當出現
starting up ...
的提示就說明鍊碼啟動成功了,在這個終端二裡可以輸出chaincode中的日志(比如通過
fmt.Print()
列印的内容)。
終端三:在cli中測試鍊碼
進入cli容器:
docker exec -it cli bash
安裝和執行個體化鍊碼(執行個體化設定了a的初始值10):
peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0
peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","10"]}' -C myc
進行測試:
調用set()接口将a的值設定為20:
peer chaincode invoke -n mycc -c '{"Args":["set", "a", "20"]}' -C myc
調用get()接口查詢a的值,發現a的值已經更新為20,測試完畢。
peer chaincode query -n mycc -c '{"Args":["get","a"]}' -C myc