zoukankan      html  css  js  c++  java
  • 如何在本地测试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.comhyperledgerfabricccsp -run ^TestKeyGenOpts$

    这里我们可以看到-run后面跟的是一个正则表达式,我们可以写其他正则表达式来表示一批方法。当然我们也可以不加^$,直接写方法名。

    如果我们不指定具体的测试用例,而只指定包,那么就是测试整个包下面的所有用例。

    go test -v -timeout 30s github.comhyperledgerfabricccsp

    这里我加了2个参数,这两个参数都是在go test的时候很常用的,-v是输出详细信息。-timeout是设置跑完整个测试的时间限制,如果里面有死循环之类的就会超时而退出。

    如果我们要测试不是某个包,而是整个文件夹下面的所有包,那么我们可以使用“…”来表示。比如:

    go test -v -timeout 60s github.comhyperledgerfabricccsp…

    2.性能测试

    go test除了提供单元测试外,还有性能测试的功能。前面说到_test.go文件里面Test开头的是单元测试的测试用例入口函数,而性能测试则是以Benchmark开头。

    Fabric本身并没有写什么性能测试的代码,但是我们可以从vendor代码中找到例子。比如:

    github.comhyperledgerfabricvendorgithub.comdockerdockerpkgstdcopy

    这里有个BenchmarkWrite函数,用于测试NewStdWriter.Write的性能,我们使用go test命令带上-bench参数就可以执行性能测试。性能测试不仅仅关心执行的时间,也关系内存的分配情况。再加上-benchmem参数,可以查看内存性能测试结果。

    go test -benchmem github.comhyperledgerfabricvendorgithub.comdockerdockerpkgstdcopy -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.comhyperledgerfabricccsp

    返回结果:

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

    但是这里返回的结果太少了,我们如果希望得到更详细的覆盖率信息,可以指定covermode和converprofile参数。

    go test -cover -covermode count -coverprofile c:Tempcover.out github.comhyperledgerfabricccsp

    这里是将覆盖率的结果输出到C:Tempcover.out这个文件中。同时使用count可以对函数的执行次数进行计数。执行完毕后,我们可以使用以下命令将cover.out转换为html在浏览器中查看:

    go tool cover -html=C:Tempcover.out

    在浏览器中,用绿色表示覆盖,而执行次数,是需要把鼠标放上去才会显示。这是我浏览器显示的覆盖率结果:

    image

    二、行为测试

    我这里翻译成行为测试可能不一定很可取,英文是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
    这里测试的就是在bddtestsfeaturesootstrap.feature的这个例子。
    测试完成后,使用
    deactivate
    命令即可退出虚拟环境,回到我们传统的命令行下。

    三、总结

    如果我们要动Fabric的源码,那么首先保证能够跑通Fabric的单元测试和行为测试,然后再改。如果是新功能模块,那么也需要写自己模块的单元测试代码。写完之后用go test来测试,保证我们的代码能够通过单元测试,而且要注意代码覆盖率,保持较高的覆盖率能够发现很多代码中隐藏的问题。

    如果我们的功能涉及到一系列的步骤操作,那么就一定要写行为测试了。行为测试可以保证整个功能串起来运行是正常的。

  • 相关阅读:
    Spring boot 请求接口404
    Windows下安装Redis
    利用maven的profiles灵活的配置多环境
    各个JSON技术的比较
    常用工具软件
    Java方法 传值方式
    JVM内存模型
    spring-task解决定时问题
    quartz Cron表达式解读
    maven 常用命令
  • 原文地址:https://www.cnblogs.com/studyzy/p/8038347.html
Copyright © 2011-2022 走看看