HyperLeger织物开发(八)——HyperLeger织物链码开发测试

  

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织物链码开发测试