如何在本地測試Fabric Code

前一篇博客講到了如何編譯本地的Fabric Code成鏡像文件,那麼若是咱們想改Fabric源代碼,實現一些Fabric官方並無提供的功能,該怎麼辦呢?這時咱們除了改源碼,增長鬚要的功能外,還須要可以跑通Fabric的測試。Fabric的測試主要包括單元測試和行爲測試,下面分別介紹。html

1、單元測試

單元測試是經過testenv這個鏡像來完成的,而這個鏡像的容器在啓動後實際執行的就是unit-test文件夾下面的run.sh腳本。咱們使用make unit-test命令便可對整個Fabric的全部單元測試進行運行。python

1.單元測試

由於Fabric是用Go寫的,因此Fabric的單元測試也是用Go的單元測試命令來完成,也就是go test命令。在Fabric的源代碼中,咱們看到的全部*_test.go這些就是單元測試的代碼。這些代碼在正式編譯的時候是會被自動忽略的,只有在go test命令的時候纔會去運行。git

以bccsp爲例,這是提供密碼學相關方法的接口文件,在bccsp文件夾下的bccsp.go文件,而他的單元測試文件天然就是bccsp_test.go文件。在該單元測試文件中,以Test開頭的函數,就是具體的測試用例。咱們要跑具體的某一個測試用例,好比其中的TestKeyGenOpts,那麼咱們的可使用命令:github

go.exe test github.com\hyperledger\fabric\bccsp -run ^TestKeyGenOpts$

這裏咱們能夠看到-run後面跟的是一個正則表達式,咱們能夠寫其餘正則表達式來表示一批方法。固然咱們也能夠不加^$,直接寫方法名。正則表達式

若是咱們不指定具體的測試用例,而只指定包,那麼就是測試整個包下面的全部用例。docker

go test -v -timeout 30s github.com\hyperledger\fabric\bccsp

這裏我加了2個參數,這兩個參數都是在go test的時候很經常使用的,-v是輸出詳細信息。-timeout是設置跑完整個測試的時間限制,若是裏面有死循環之類的就會超時而退出。bootstrap

若是咱們要測試不是某個包,而是整個文件夾下面的全部包,那麼咱們可使用「…」來表示。好比:ubuntu

go test -v -timeout 60s github.com\hyperledger\fabric\bccsp\…

2.性能測試

go test除了提供單元測試外,還有性能測試的功能。前面說到_test.go文件裏面Test開頭的是單元測試的測試用例入口函數,而性能測試則是以Benchmark開頭。瀏覽器

Fabric自己並無寫什麼性能測試的代碼,可是咱們能夠從vendor代碼中找到例子。好比:app

github.com\hyperledger\fabric\vendor\github.com\docker\docker\pkg\stdcopy

這裏有個BenchmarkWrite函數,用於測試NewStdWriter.Write的性能,咱們使用go test命令帶上-bench參數就能夠執行性能測試。性能測試不只僅關心執行的時間,也關係內存的分配狀況。再加上-benchmem參數,能夠查看內存性能測試結果。

go test -benchmem github.com\hyperledger\fabric\vendor\github.com\docker\docker\pkg\stdcopy -bench ^BenchmarkWrite$

如下是我在本機執行的結果:

BenchmarkWrite-4   5000000     283 ns/op    15507.52 MB/s    0 B/op    0 allocs/op

PASS

ok     github.com/hyperledger/fabric/vendor/github.com/docker/docker/pkg/stdcopy   2.406s

Success: Benchmarks passed.

3.代碼覆蓋率

代碼覆蓋率是度量測試自身完整和有消息的一種手段。經過覆蓋率值,咱們能夠分析測試代碼的編寫質量。

在go test命令後跟上-cover參數,就能夠提供代碼覆蓋率百分比的結果。

go test -cover github.com\hyperledger\fabric\bccsp

返回結果:

ok      github.com/hyperledger/fabric/bccsp     2.828s  coverage: 100.0% of statements

可是這裏返回的結果太少了,咱們若是但願獲得更詳細的覆蓋率信息,能夠指定covermode和converprofile參數。

go test -cover -covermode count -coverprofile c:\Temp\cover.out github.com\hyperledger\fabric\bccsp

這裏是將覆蓋率的結果輸出到C:\Temp\cover.out這個文件中。同時使用count能夠對函數的執行次數進行計數。執行完畢後,咱們可使用如下命令將cover.out轉換爲html在瀏覽器中查看:

go tool cover -html=C:\Temp\cover.out

在瀏覽器中,用綠色表示覆蓋,而執行次數,是須要把鼠標放上去纔會顯示。這是我瀏覽器顯示的覆蓋率結果:

image

2、行爲測試

我這裏翻譯成行爲測試可能不必定很可取,英文是BDDTests,BDD是敏捷開發中的一個概念,英文是Behavior Driven Development,能夠認爲是TDD的升級版吧。全部行爲測試的代碼都在Fabric文件夾下面的bddtests文件夾中。

要進行Fabric的行爲測試,須要安裝相關的環境,Fabric主要用到的是Behave這個工具,https://github.com/behave/behave

官方給咱們提供了安裝腳本,直接運行:

sudo ./scripts/install_behave.sh

這裏須要安裝的包比較多,安裝完成後咱們就能夠進行BDD的測試了。

官方的make命令下就爲咱們提供了執行所有行爲測試的命令:

make behave

系統就會按照配置的場景,啓動對應的Docker容器,進行行爲測試。

若是咱們想跑某一個行爲測試,而不是所有,那麼就須要進一步的設置,具體參考:https://github.com/hyperledger/fabric/tree/release/bddtests

依次執行如下代碼:

sudo pip install virtualenv
sudo pip install virtualenvwrapper
export WORKON_HOME=~/Envs
source /usr/local/bin/virtualenvwrapper.sh
mkvirtualenv -p /usr/bin/python2.7 behave_venv
執行完上面命令後,咱們能夠看到咱們的命令行變成了:
(behave_venv) studyzy@ubuntu1:~/go/src/github.com/hyperledger/fabric/bddtests$ 
接下來再安裝如下工具:
pip install behave 
pip install grpcio-tools 
pip install "pysha3==1.0b1" 
pip install b3j0f.aop 
pip install jinja2 
pip install pyopenssl 
pip install ecdsa 
pip install python-slugify 
pip install pyyaml

總的來講就是給behave的執行設置了一個虛擬環境,全部代碼的執行是在這個虛擬環境中執行,不會影響真實環境。

安裝完畢後,咱們想要測試某一個BDDTest,那麼能夠執行:

cd bddtests
behave -k -D cache-deployment-spec features/bootstrap.feature
這裏測試的就是在bddtests\features\bootstrap.feature的這個例子。
測試完成後,使用
deactivate
命令便可退出虛擬環境,回到咱們傳統的命令行下。

3、總結

若是咱們要動Fabric的源碼,那麼首先保證可以跑通Fabric的單元測試和行爲測試,而後再改。若是是新功能模塊,那麼也須要寫本身模塊的單元測試代碼。寫完以後用go test來測試,保證咱們的代碼可以經過單元測試,並且要注意代碼覆蓋率,保持較高的覆蓋率可以發現不少代碼中隱藏的問題。

若是咱們的功能涉及到一系列的步驟操做,那麼就必定要寫行爲測試了。行爲測試能夠保證整個功能串起來運行是正常的。

相關文章
相關標籤/搜索