自动生成测试数据思路
首先每个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还不支持浮点型 |