如何在本地测试Fabric Code
前一篇博客讲到了如何编译本地的Fabric Code成镜像文件,那么如果我们想改Fabric源代码,实现一些Fabric官方并没有提供的功能,该怎么办呢?这时我们除了改源码,增加需要的功能外,还需要能够跑通Fabric的测试。Fabric的测试主要包括单元测试和行为测试,下面分别介绍。
一、单元测试
单元测试是通过testenv这个镜像来完成的,而这个镜像的容器在启动后实际执行的就是unit-test文件夹下面的run.sh脚本。我们使用make unit-test命令即可对整个Fabric的所有单元测试进行运行。
1.单元测试
因为Fabric是用Go写的,所以Fabric的单元测试也是用Go的单元测试命令来完成,也就是go test命令。在Fabric的源代码中,我们看到的所有*_test.go这些就是单元测试的代码。这些代码在正式编译的时候是会被自动忽略的,只有在go test命令的时候才会去运行。
以bccsp为例,这是提供密码学相关方法的接口文件,在bccsp文件夹下的bccsp.go文件,而他的单元测试文件自然就是bccsp_test.go文件。在该单元测试文件中,以Test开头的函数,就是具体的测试用例。我们要跑具体的某一个测试用例,比如其中的TestKeyGenOpts,那么我们的可以使用命令:
go.exe test github.com\hyperledger\fabric\bccsp -run ^TestKeyGenOpts$
这里我们可以看到-run后面跟的是一个正则表达式,我们可以写其他正则表达式来表示一批方法。当然我们也可以不加^$,直接写方法名。
如果我们不指定具体的测试用例,而只指定包,那么就是测试整个包下面的所有用例。
go test -v -timeout 30s github.com\hyperledger\fabric\bccsp
这里我加了2个参数,这两个参数都是在go test的时候很常用的,-v是输出详细信息。-timeout是设置跑完整个测试的时间限制,如果里面有死循环之类的就会超时而退出。
如果我们要测试不是某个包,而是整个文件夹下面的所有包,那么我们可以使用“…”来表示。比如:
go test -v -timeout 60s github.com\hyperledger\fabric\bccsp\…
2.性能测试
go test除了提供单元测试外,还有性能测试的功能。前面说到_test.go文件里面Test开头的是单元测试的测试用例入口函数,而性能测试则是以Benchmark开头。
Fabric本身并没有写什么性能测试的代码,但是我们可以从vendor代码中找到例子。比如:
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- ns/op 15507.52 MB/s B/op allocs/op PASS ok github.com/hyperledger/fabric/vendor/github.com/docker/docker/pkg/stdcopy .406s Success: Benchmarks passed.
3.代码覆盖率
代码覆盖率是度量测试自身完整和有消息的一种手段。通过覆盖率值,我们可以分析测试代码的编写质量。
在go test命令后跟上-cover参数,就可以提供代码覆盖率百分比的结果。
go test -cover github.com\hyperledger\fabric\bccsp
返回结果:
ok github.com/hyperledger/fabric/bccsp .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. 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来测试,保证我们的代码能够通过单元测试,而且要注意代码覆盖率,保持较高的覆盖率能够发现很多代码中隐藏的问题。
如果我们的功能涉及到一系列的步骤操作,那么就一定要写行为测试了。行为测试可以保证整个功能串起来运行是正常的。
如何在本地测试Fabric Code的更多相关文章
- 如何在本地编译Fabric Code
之前的博客都是拿官方现成的Docker镜像来用,但是并没有自己动手做镜像,也没有说到如何去开发和测试Fabric的代码.这一篇博客就从入门的角度讲解如何编译.测试和开发Fabric. 一.环境准备 要 ...
- 本地测试AJAX请求
要在本地测试AJAX,首先是环境的搭建,因为XHR对象的open方法中参数url是指文件在服务器上的文件.下面以WampServer为例. 1. 下载wamp的安装包,下载地址为:http://221 ...
- https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
一:什么是https SSL(Security Socket Layer)全称是加密套接字协议层,它位于HTTP协议层和TCP协议层之间,用于建立用户与服务器之间的加密通信,确保所传递信息的安 ...
- 【转】https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
正需要这个,写的很好,就转过来了 转自: http://www.cnblogs.com/naniannayue/ 一:什么是https SSL(Security Socket Layer)全称 ...
- 用java开发微信公众号:测试公众号与本地测试环境搭建(一)
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/5023678.html 俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一 ...
- 在本地测试一次成功的AJAX请求
要在本地测试AJAX,首先是环境的搭建,下面以wamp为例. 1.先在wamp的官网下载wamp的安装包,网址 http://www.wampserver.com/. 2.安装wamp.如果安装过程中 ...
- win10系统iis下部署搭建https (ssl/tls)本地测试环境
有时想要把公司的某些XX项目部署成https站点,是为了在传输层加密传输,防止他人嗅探站点重要数据信息,平常我们使用的http方式都是明文方式传输的很不安全,容易被他人窃取.而有些时候要在本地搭建ht ...
- win7 windows server 2008R2下 https SSL证书安装的搭配(搭配https ssl本地测试环境)
原文:http://www.cnblogs.com/naniannayue/archive/2012/11/19/2776948.html 要想成功架设SSL安全站点关键要具备以下几个条件. 1.需要 ...
- storm sum aggregate 原语 聚合 本地测试
编写storm程序,对数据进行聚合并且写入到mysql, 本文 主要说明数据中有多个字段需要进行sum或其他操作时的程序写法 1.主程序main方法,storm 拓扑运行入口 public clas ...
随机推荐
- React 基础入门
React 起源于 Facebook 内部项目,是一个用来构建用户界面的 Javascript 库,相当于MVC架构中的V层框架,与市面上其他框架不同的是,React 把每一个组件当成了一个状态机,组 ...
- Re:Unity游戏开发有哪些让你拍案叫绝的技巧?
这是我在知乎一个问题: <Unity游戏开发有哪些让你拍案叫绝的技巧?> 下面的回答,觉得蛮有趣的,贴在这里和博客的朋友们分享下. ----- 分享一个比较好玩的内容吧. 大家都知道Uni ...
- 最短路问题之Bellman-ford算法
题目: 最短路:给定两个顶点,在以这两个点为起点和终点的路径中,边的权值和最小的路径.考虑权值为点之间的距离. 单源最短路问题,Bellman-ford算法 思路:每次循环检查所有边,可优化. 应用于 ...
- 跟我一起学opencv 第五课之图像的混合
*理论-线性混合操作 g(x) = (1-α)f0(x)+αf1(x) α的取值范围位0-1之间 f0(x)为图像1,f1(x)表示第二张图像 α是混合系数 g(x)是生成的图像,对每一个像素 ...
- 由浅入深讲述MVVM
相信首次听说MVVM的人,内心都是充满疑惑的!这是个嘛???能干嘛??? MVVM是Model-View-ViewModel的简写.它本质上就是MVC (Model-View- Controller) ...
- 【深度学习】--GAN从入门到初始
一.前述 GAN,生成对抗网络,在2016年基本火爆深度学习,所有有必要学习一下.生成对抗网络直观的应用可以帮我们生成数据,图片. 二.具体 1.生活案例 比如假设真钱 r 坏人定义为G 我们通过 ...
- 【机器学习】--模型评估指标之混淆矩阵,ROC曲线和AUC面积
一.前述 怎么样对训练出来的模型进行评估是有一定指标的,本文就相关指标做一个总结. 二.具体 1.混淆矩阵 混淆矩阵如图: 第一个参数true,false是指预测的正确性. 第二个参数true,p ...
- Xcode 10 iOS12 "A valid provisioning profile for this executable was not found
问题:Xcode10 build 没问题,跑虚拟机也没问题,数据线连上run到真机上出现 Xcode 10 iOS12 "A valid provisioning profile for t ...
- Python中路径操作
目录 1. os.path模块 2. pathlib模块 2.1 目录操作 2.2 文件操作 3. shutil模块 3.1 os模块 3.2 shutil模块 1. os.path模块 3.4版本之 ...
- qml demo分析(customgeometry-贝塞尔曲线)
一.效果展示 本篇文章还是带来一个简单的qt示例分析,且看图1效果. 图1 贝塞尔曲线 二.源码分析 该示例代码所在目录quick\scenegraph\customgeometry,感兴趣的同学可以 ...