autotest
自动化系统回归测试工具,外部支持输入测试用例配置文件,
输出测试用例执行结果并记录详细执行日志。
内部代码支持用例扩展开发,继承并实现通用接口,即可自定义实现用例类型。
编译
通过 chain makefile
$ make autotest
运行
直接执行
已启动 chain 服务并需要自定义配置用例文件
$ ./autotest -f autotest.toml -l autotest.log
-f,-l 分别指定配置文件和日志文件,
不指定默认为 autotest.toml,autotest.log
通过 chain makefile
chain 开发人员修改框架或 dapp 代码,验证测试
//启动单节点solo版本chain,运行默认配置autotest,dapp用于指定需要跑的配置用例
$ make autotest dapp=coins
$ make autotest dapp="coins token"
//dapp=all,执行所有预配置用例
$ make autotest dapp=all
目前 autotest 支持的 dapp 有,coins token trade privacy,后续有待扩展
配置文件
配置文件为 toml 格式,用于指定具体的测试用例文件
# 指定内部调用chain-cli程序文件
cliCmd = "./chain-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 类型,以 chain/system/dapp/coins 为例
增加 autotest 目录,并新建 coins.go 文件
package autotest
//导入autotest开发依赖,主要是types包
import (
"reflect"
. "github.com/assetcloud/chain/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类型
根据需要重写以上接口,灵活定义用例行为