如何在本地测试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 ...
随机推荐
- .NET 基金会完成第一次全面改选
.NET基金会是一个独立的组织,支持.NET社区和开源,旨在拓宽和加强.NET生态系统和社区.这可以通过多种方式完成,包括项目指导,指导,法律和营销帮助,技术和财务支持设置等,2014年微软组织成立. ...
- C#冒泡排序算法(简单好理解)
我对冒泡排序算法的理解: 把最大的往后,从最后一个与前一个对比,然后互换位置,直到全部换好. 目标:从小到大排序 源代码如下: namespace net冒泡排序{ class Program { s ...
- appium-desktop定位元素原理
初衷 最近在编写Android App自动化用例,其中元素定位相对来说耗费的时间比较长.我们都知道Appium-desktop拥有自己的录制功能,我们就在想是不是可以把录制功能跟我司的自动化框架(AT ...
- 你连Nginx怎么转发给你请求都说不清楚,还好意思说自己不是CRUD工程师?
目录 一.Nginx工作原理二.Nginx进程模型三.Nginx处理HTTP请求流程 Nginx 工作原理 Nginx由内核和模块组成,Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅 ...
- python基础-函数(9)
一.函数的介绍 如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数 函数的语法格式: def 函数名(): 函数的功能代码 ...
- 生产环境中学习Redis
摘要 看到这篇文章,很有借鉴意义,因此写个读书笔记,不算是翻译.想要深入了解,请看原文http://tech.trivago.com/2017/01/25/learn-redis-the-hard-w ...
- Spring Cloud实战的代码和视频位置
大家好,本博文的连接里包含了Spring Cloud实战的代码和视频位置. 代码下载连接: 视频下载连接:
- Elasticsearch之索引模板index template与索引别名index alias
为什么需要索引模板? 在实际工作中针对一批大量数据存储的时候需要使用多个索引库,如果手工指定每个索引库的配置信息(settings和mappings)的话就很麻烦了. 所以,这个时候,就存在创建索引模 ...
- python:socket网络编程
Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket, 又称为“套接字”. 模块 import socket 创建套接字 socket.socket( ...
- Javascript中双等号(==)隐性转换机制
在Javascript中判断相等关系有双等号(==)和三等号(===)两种.其中双等号(==)是值相等,而三等号(===)是严格相等(值及类型是否完全相等). 因此有几个常识知识: 1.对于strin ...