前一篇博客讲到了如何编译本地的Fabric Code成镜像文件,那么若是咱们想改Fabric源代码,实现一些Fabric官方并无提供的功能,该怎么办呢?这时咱们除了改源码,增长须要的功能外,还须要可以跑通Fabric的测试。Fabric的测试主要包括单元测试和行为测试,下面分别介绍。html
单元测试是经过testenv这个镜像来完成的,而这个镜像的容器在启动后实际执行的就是unit-test文件夹下面的run.sh脚本。咱们使用make unit-test命令便可对整个Fabric的全部单元测试进行运行。python
由于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\…
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.
代码覆盖率是度量测试自身完整和有消息的一种手段。经过覆盖率值,咱们能够分析测试代码的编写质量。
在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
在浏览器中,用绿色表示覆盖,而执行次数,是须要把鼠标放上去才会显示。这是我浏览器显示的覆盖率结果:
我这里翻译成行为测试可能不必定很可取,英文是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
命令便可退出虚拟环境,回到咱们传统的命令行下。
若是咱们要动Fabric的源码,那么首先保证可以跑通Fabric的单元测试和行为测试,而后再改。若是是新功能模块,那么也须要写本身模块的单元测试代码。写完以后用go test来测试,保证咱们的代码可以经过单元测试,并且要注意代码覆盖率,保持较高的覆盖率可以发现不少代码中隐藏的问题。
若是咱们的功能涉及到一系列的步骤操做,那么就必定要写行为测试了。行为测试能够保证整个功能串起来运行是正常的。