autotest
自动化系统回归测试工具,外部支持输入测试用例配置文件,
输出测试用例执行结果并记录详细执行日志。
内部代码支持用例扩展开发,继承并实现通用接口,即可自定义实现用例类型。
编译
通过chain33 makefile
$ make autotest
运行
直接执行
已启动chain33服务并需要自定义配置用例文件
$ ./autotest -f autotest.toml -l autotest.log
-f,-l分别指定配置文件和日志文件,
不指定默认为autotest.toml,autotest.log
通过chain33 makefile
chain33开发人员修改框架或dapp代码,验证测试
//启动单节点solo版本chain33,运行默认配置autotest,dapp用于指定需要跑的配置用例
$ make autotest dapp=coins
$ make autotest dapp="coins token"
//dapp=all,执行所有预配置用例
$ make autotest dapp=all
目前autotest支持的dapp有,coins token trade privacy,后续有待扩展
配置文件
配置文件为toml格式,用于指定具体的测试用例文件
# 指定内部调用chain33-cli程序文件
cliCmd = "./chain33-cli"
# 进行用例check时,主要根据交易hash查询回执,多次查询失败总超时,单位秒
checkTimeout = 60
# 测试用例配置文件,根据dapp分类
[[TestCaseFile]]
contract = "bty" # coins合约
filename = "bty.toml" # 用例文件路径
[[TestCaseFile]]
contract = "token" # token合约
filename = "token.toml"
用例文件
用例文件用于配置具体的测试用例,采用toml格式,dapp的autotest目录下预配置了跑ci的用例文件,如coins.toml:
[[TransferCase]]
id = "btyTrans1"
command = "send coins transfer -a 10 -t 1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt"
amount = "10"
checkItem = ["balance"]
repeat = 1
用例类型
基本类型
BaseCase,所有用例的基类类型
type BaseCase struct {
ID string `toml:"id"` //用例id
Command string `toml:"command"` //执行的cli命令
Dep []string `toml:"dep,omitempty"` //依赖的用例id数组
CheckItem []string `toml:"checkItem,omitempty"` //回执中需要check项
Repeat int `toml:"repeat,omitempty"` //重复执行次数
Fail bool 'toml:"fail,omitempty"' //错误标志,置true时表示用例本身为错误用例,默认不配置为false
}
CheckItem,默认会检查交易回执执行结果,并根据用例不同支持以下字段
- balance,交易双方余额校验
- frozon, 涉及冻结余额操作校验
- utxo, 隐私相关交易,校验utxo余额
Coins合约
- TransferCase,转账
- WithdrawCase,从合约取出
Token合约
- TokePreCreateCase,token预创建
- TokenFinishCreateCase,token完成创建
Trade合约
- SellCase,token出售
- DependBuyCase,token买入,需要在dep字段指定依赖的SellCase的id
Privacy合约
- PubToPrivCase,公对私转账
- PrivToPubCase,私对公转账
- PrivToPrivCase,私对私转账
...
日志分析
扩展开发
分为以下几个步骤
注册dapp的AutoTest类型,以chain33/system/dapp/coins为例
增加autotest目录,并新建coins.go文件
package autotest
//导入autotest开发依赖,主要是types包
import (
"reflect"
. "github.com/PhenixChain/devchain/cmd/autotest/types"
)
//声明coins的AutoTest结构,其成员皆为coins将实现的用例类型
type coinsAutoTest struct {
SimpleCaseArr []SimpleCase `toml:"SimpleCase,omitempty"`
TransferCaseArr []TransferCase `toml:"TransferCase,omitempty"`
WithdrawCaseArr []WithdrawCase `toml:"WithdrawCase,omitempty"`
}
//注册AutoTest类型
//coinsAutoest结构需要实现AutoTest接口,
//才能进行注册,该接口共有两个函数
func init() {
RegisterAutoTest(coinsAutoTest{})
}
//返回dapp名字
func (config coinsAutoTest) GetName() string {
return "coins"
}
//返回AutoTest的类型
func (config coinsAutoTest) GetTestConfigType() reflect.Type {
return reflect.TypeOf(config)
}
实现用例的测试行为
SendCommand(id string) //实现用例执行命令的行为
//实现用例check回执行为,正常的交易类型继承即可,无须重写。特殊需要可以重写
CheckResult(CheckHandlerMap) (bool, bool)
//需要实现用例checkItem每一项的check行为,并用该接口返回FunctionMap
getCheckHandlerMap() interface{} 返回CheckHandlerMap类型
根据需要重写以上接口,灵活定义用例行为