使用PTE对目标Fabric网络进行测试
PTE的官方git:
https://github.com/dongmingh/v1performance#performance-traffic-engine---pte
The Performance Traffic Engine(PTE) 使用SDKs与Hyperledger Fabric网络进行交互,其向一个或者多个网络发送请求并接受响应。目前只支持Node SDK。
PTE的设计主要为了满足两个需求:
- 监控Fabric复杂的网络,包括节点地址,节点数量、channel的数量、组织、peer和orderers等。
- 支持多样的测试用例,例如不同的chaincode、交易数量、测试时间、类型、模式以及部署规模等。
PTE在设计时着重考虑灵活性和模块哈。其提供了针对各种测试用例的操作选择。其设计图如下:
PTE的基本功能有:
- channel:创建和加入channel
- chaincode:安装和实例化chaincode
- transaction:发送交易到目标peer,可以定制化交易的类型、模式和频率
- Network:可以与本地或者远程的fabric网络进行交互
- scaling:轻松扩展多网络、orderer、peers、组织、channel和chaincode
- event:开启event端口,维护和记录event的接收和未接收状态
- Blockchain高度:可以查询Blockchain的高度和transaction的数量
- result:支持对发送交易的event接收,以及校验交易完成后的Blockchain状态
- 多PTEs:轻松构建多个PTEs
准备
在测试之前需要准备一些运行的环境:
- node和npm lts/boron release (v6.10.x and v3.10.x)
- node V7并没有支持
- gulp
npm install -g gulp
- go(v1.7 or later)
如果你想要在测试本地的fabric网络。则需要docker环境并且构建fabric网络,参考:Hyperledger Fabric Doc。
开始测试
- 下载fabric-test源码
go get -d github.com/hyperledger/fabric-test
- 下载或者更新Fabric、fabric-ca和fabric-sdk-node,可参考fabric-test。
- 进入fabric-test目录
cd $GOPATH/src/github.com/hyperledger/fabric-test - 第一次启动的时候
git submodule update --init --recursive
git submodule foreach git pull origin master - 非第一次启动
git submodule foreach git pull origin master
- 获取需要的docker镜像
如果如果你使用的是自己已经构建成功的fabric网络或者remote网络,则可以跳过该步骤。
- fabric
* 从dockerhub'中下载
cd $GOPATH/src/github.com/hyperledger/fabric-test/fabric/scripts
如果针对V1.0.0进行测试,则使用脚本./bootstrap-1.0.0.sh
* 构建images(示例为v1.0.0)
cd $GOPATH/src/github.com/hyperledger/fabric-test/fabric/
git checkout v1.0.0
make docker
- fabric-ca
cd $GOPATH/src/github.com/hyperledger/fabric-test/fabric-ca
git checkout v1.0.0
make docker
- fabric-sdk-node
cd $GOPATH/src/github.com/hyperledger/fabric-test/fabric-sdk-node
npm install
//这里可以忽略所有的warning
gulp ca
- 安装PTE
cd $GOPATH/src/github.com/hyperledger/fabric-test/tool
cp -r PTE $GOPATH/src/github.com/hyperledger/fabric-test/fabric-sdk-node/test
- 创建Service Credentials 文件
在SCFiles
中有很多示例可以参考。将需要测试的Fabric网络中的节点地址和证书等信息进行替换即可。 - 按照需求构建运行脚本
根据测试需求,创建自己的PTEMgr.txt文件(使用pte_mgr.sh来测试运行),runCase.txt文件和用户输入用的json文件。
这里有几点需要注意:
- 正确的使用需要测试的chaincode名称、channel名称和组织的名称。
- 使用自己网络里的配置信息
- 在测试之前,需要创建好所有的channnel,确保所有需要的peer都join到channel中。以及chaincode被正确的安装在各个peer内,同时在指定的channel中进行了instantiate。确保所有的peer都被正确的建立和运行。
运行PTE
这里确保在运行PTE之前,需要测试的fabric网络已经启动。
使用方法
有两个方法可以执行PTE:
- pte_mgr.sh :可以执行多个PTE测试
- pte_driver.sh:只能执行一个PTE测试
pte_mgr.sh
运行脚本:
./pte_mgr.sh <PTE mgr input file>
示例:
./pte_mgr.sh sampleccInputs/PTEMgr.txt
该测试包含了一个用户测试用例列表。每一行都是一个用户的run case,其包含了两个参数:drive type和用例文件(run case files)。
例如,下面这个就包含了两个run case,driver type都是pte。现阶段只支持pte。
driver=pte sampleccInputs/runCases-constant-i-TLS.txt
driver=pte sampleccInputs/runCases-constant-q-TLS.txt
pte_driver.sh
运行脚本:
./pte_driver.sh <run cases file>
示例:
./pte_driver.sh sampleccInputs/runCases.txt
该示例包含了一个测试用例的列表。每一行都是一个测试用例,包含两个参数:SDK type和用户输入文件(User input files),
例如,下面这个就包含了三个测试用例。同时SDK type可以是:node、go、python和java。不过现在只支持node。关于用户输入的相关信息,下文会进行介绍。
sdk=node sampleccInputs/samplecc-chan1-i-TLS.json
sdk=node sampleccInputs/samplecc-chan2-i-TLS.json
sdk=node sampleccInputs/samplecc-chan3-i-TLS.json
交易执行
PTE用一个用户输入文件(执行参数)视为一个测试用例。User input files定义了执行一个测试所需的所有参数,包括
- 交易类型
- 线程数量
- 交易数量
- 交易时长(持续交易)
在同一个测试中,所有的线程都会并发执行指定的交易。不同的交易会使用不同的测试用例来执行,PTE支持将他们统一到同一个run case file中,使其成为一个更加复杂的脚本。例如,一个PTE执行时,用户可以向所有的peers发送指定数量的invoke交易,以及可以对每一个peer进行分离式的query。
交易控制:
交易本身可以根据数量或者持续时间来进行控制。其可以通过两个参数进行控制
- nRequest
- rundur
交易类型
Invoke(move)
执行invoke(move)的交易,设置transType为Invoke和invokeType为move。
"invokeCheck": "TRUE",
"transMode": "Constant",
"transType": "Invoke",
"invokeType": "Move",
"targetPeers": "OrgAnchor",
"nProcPerOrg": "4",
"nRequest": "1000",
"runDur": "600",
"TLS": "Enabled",
同时,需要设置channel的名称和相关信息:
"channelOpt": {
"name": "testchannel1",
"channelTX": "/root/gopath/src/github.com/hyperledger/fabric-test/fabric/common/tools/cryptogen/crypto-config/ordererOrganizations/testorgschannel1.tx",
"action": "create",
"orgName": [
"testOrg1"
]
},
Invoke(query)
执行Invoke(query)交易,设置transType为Invoke,InvokeType为Query。
"invokeCheck": "TRUE",
"transMode": "Constant",
"transType": "Invoke",
"invokeType": "Query",
"targetPeers": "OrgAnchor",
"nProcPerOrg": "4",
"nRequest": "1000",
"runDur": "600",
"TLS": "Enabled",
同时设置channel的信息,同move。
简单的用例
待续