HyperLeger织物开发(八)——HyperLeger织物链码开发测试
一、链码实例
SACC项目链码实例如下:
<代码>包主要 导入( “fmt” "github.com/hyperledger/fabric/core/chaincode/shim” "github.com/hyperledger/fabric/protos/peer” )//SimpleAsset实现一个简单的chaincode管理资产 SimpleAsset struct类型{ }//初始化方法在链码实例化或链码升级期间调用 func (t * SimpleAsset) Init(存根shim.ChaincodeStubInterface)同行。响应{//从交易提案获取参数 参数:=stub.GetStringArgs () 如果len (args) !=2 { 返回垫片。错误(“不正确的参数。期待一个键和一个值”) }//存储资产到账本 错:=存根。PutState (args[0],[]字节(args [1])) 如果犯错!=nil { 返回shim.Error (fmt。Sprintf(“未能创建资产:% s参数[0])) } 返回shim.Success(零) }//调用方法在链码上执行每次交易时被调用 func (t * SimpleAsset)调用(存根shim.ChaincodeStubInterface)对等。响应{//从交易提案提取参数 fn, arg游戏:=stub.GetFunctionAndParameters () var结果字符串 var犯错的错误 如果fn=="设置" { 因此,呃=集(存根,args) 其他}{//假设“得到”即使fn nil 结果,呃=(存根,args) } 如果犯错!=nil { 返回shim.Error (err.Error ()) }//返回结果作为成功的负载 返回shim.Success([]字节(结果)) }//在账本上使用键值设置资产,如果关键存在,使用新的值更新 函数集(存根垫片。ChaincodeStubInterface, args)[]字符串(字符串,错误){ 如果len (args) !=2 { 返回",fmt。Errorf(“不正确的参数。期待一个键和一个值”) } 错:=存根。PutState (args[0],[]字节(args [1])) 如果犯错!=nil { 返回",fmt。Errorf(“未能设定资产:% s参数[0]) } 返回参数[1],nil }//获取指定资产键的值 func(存根垫片。ChaincodeStubInterface, args)[]字符串(字符串,错误){ 如果len (args) !=1 { 返回",fmt。Errorf(“不正确的参数。期待一个关键”) } 价值,犯错:=stub.GetState (args [0]) 如果犯错!=nil { 返回",fmt。Errorf(“未能获得资产:% s与错误:% s”, arg游戏[0],犯错) } 如果value=https://www.yisu.com/zixun/=nil { 返回",fmt。Errorf(“资产未找到:% s参数[0]) } 返回字符串(价值),零 }//实例化期间在容器启动链码 函数main () { 如果犯错:=shim.Start(新(SimpleAsset));犯错!=nil { fmt。Printf("错误开始SimpleAsset chaincode: % s”,呃) } }代码>
二、链码的单元测试
1,链码的单元测试简介
链码开发完毕后,并不需要在区块链环境中部署链码才能进行调试,可以利用shim.MockStub来编写单元测试代码,直接在去语言开发环境(无布区块链网络的环境)中调试。
2,链码测试代码编写
进入sacc目录,新建一个编写测试代码的sacc_test.go文件
<代码>包主要 导入( “测试” "github.com/hyperledger/fabric/core/chaincode/shim” “fmt” ) func TestSet (t * testing.T) {//模拟链码部署 鳞状细胞癌:=new (SimpleAsset) 存根:=垫片。NewMockStub (“SimpleAsset”,鳞状细胞癌) mockInit (t,存根,[][]字节{[]字节(user1),[]字节(“0”)})//调用链码的交易方法 invokeSet (t,存根,[]字符串{" user1 ", " 10000 "}) invokeSet (t,存根,[]字符串{" user1 ", " 1000 "}) } func mockInit (t *测试。T,存根*垫片。MockStub args[][]字节){ res:=存根。MockInit (“1”, args) 如果res.Status !=垫片。好{ fmt。Println(“初始化失败”,字符串(res.Message)) t.FailNow () } } func invokeSet (t *测试。T,存根*垫片。MockStub args[]字符串){//调用调用 res:=存根。MockInvoke(“1”,[][]字节{[]字节(“套”),[]字节(args[0]),[]字节(args [1])}) fmt。Println(“集(“+ args [0] +”、“+ args [1] +”)”) 如果res.Status !=垫片。好{ fmt。Println(“调用设置失败:“,arg游戏[0],字符串(res.Message)) t.FailNow () } } func TestGet (t * testing.T) {//模拟链码部署 鳞状细胞癌:=new (SimpleAsset) 存根:=垫片。NewMockStub (“SimpleAsset”,鳞状细胞癌) mockInit (t,存根,[][]字节{[]字节(user1),[]字节(" 10000 ")})//调用链码 invokeGet (t,存根,[]字符串{" user1 "}) } func invokeGet (t *测试。T,存根*垫片。MockStub args[]字符串){//调用调用 res:=存根。MockInvoke(“1”,[][]字节{[]字节(“获得”),[]字节(args [0])}) fmt。Println (“get (" + args [0] + ")”+”→“+字符串(res.Payload)) 如果res.Status !=垫片。好{ fmt。Println(“调用会失败:“,arg游戏[0],字符串(res.Message)) t.FailNow () } }//输出://===TestSet运行//设置(user1, 10000)//设置(user1, 1000)//- - - - - -通过:TestSet(0.00秒)//===TestGet运行//得到(user1)→10000//- - - - - -通过:TestGet(0.00秒)//通过HyperLeger织物开发(八)——HyperLeger织物链码开发测试