自动生成测试用例方法

Posted by 谢智健 on October 20, 2018

You may find interesting:


2018.1.18区块链论文讨论班通知


Nothing at stake problem of PoS

自动生成测试数据思路

首先每个solidity文件编译后根据选择不同可以编译成bin、abi两种不同的文件,本设计思路是根据abi文件进行拆分。

其中abi文件中可以直接转换成json格式,具体例子如下:

第一部分
第二部分
第三部分 备注
{ "constant": true,
"inputs
": [{
"name": "a",
"type": "int256"
}, {
"name": "b",
"type": "int256"
}],
"name": "add",
"outputs": [{
"name": "",
"type": "int256"
}],
"payable": false,
"stateMutability": "pure",
"type": "function
"
}
{ "constant": true,
"inputs
": [{
"name": "a",
"type": "int256"
}, {
"name": "b",
"type": "int256"
}],
"name": "sub",
"outputs": [{
"name": "",
"type": "int256"
}],
"payable": false,
"stateMutability": "pure",
"type": "function
"
},
{ "constant": true,
"inputs": [],
"name": "show",
"outputs": [{
"name": "",
"type": "string"
}],
"payable": false,
"stateMutability": "pure",
"type": "function
"
}
左边是根据一个abi的内容将其拆分成三个不同的部分
目标是要提取出所有的function并得到所有的input,最后
得到如下形式的信息:
[
{'name': 'add', 'types': ['int256', 'int256']},
{'name': 'sub', 'types': ['int256', 'int256']},
{'name': 'show', 'types': []}
]

开始自动生成的数据了。目前solidty参数类型并不多,并且可分为两类,生成的思路有所不同

  • 定长数据:直接随机生成对应类型的数据
  • 不定长数据:先随机生成长度,在随机生成数据
参数类型 生成思路
整型
uint256[256]
提取类型中的参数的数字,数字1,数字2……,其中数字1为类型长度,其余数字为数据的数量
uint为无符号数,int为符号数,自动随机生成所需要的数据
字节 bytes32、byte[]
提取类型中的参数的数字,数字1,数字2……,其中数字1为类型长度,其余数字为数据的数量
自动生成以16进制表示的字节数据
地址类型 address
方案一(目前使用):随机生成20字节的地址数据
方案二(以后使用):在已有的合约地址和账户地址中随机选取一个账户地址。
构造合约地址池
布尔类型 bool
生成True或者False
浮点型 v0.4.25还不支持浮点型