在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:qiniu/httptest开源软件地址:https://github.com/qiniu/httptest开源编程语言:Go 100.0%开源软件介绍:httptest下载
概述一些背景资料:
这是一套 HTTP 服务测试脚本框架及实用程序。我们定义了一个测试脚本的 DSL 语言。大体看起来是这样的: #为了让一套代码同时可以测试 Stage 环境和 Product 环境,我们推荐将 Host、AK/SK 作为环境变量传入
#同时也避免了 AK/SK 这样敏感内容进入代码库
match $(env) `envdecode QiniuTestEnv`
auth qboxtest `qbox $(env.AK) $(env.SK)`
host rs.qiniu.com $(env.RSHost)
post http://rs.qiniu.com/delete/`base64 Bucket:Key`
auth qboxtest
#发起请求,并开始检查结果
ret 200
post http://rs.qiniu.com/batch
auth qboxtest
match $(ekey1) |base64 Bucket:Key|
match $(ekey2) |base64 Bucket2:Key2|
json '{
"op": ["/delete/$(ekey1)", "/delete/$(ekey2)"]
}'
#发起请求,并开始检查结果
ret 200
post http://rs.qiniu.com/batch
auth qboxtest
form op=/delete/`base64 Bucket:Key`&op=/delete/`base64 Bucket:NotExistKey`
#发起请求,并开始检查结果
ret 298
json '[{"code": $(code1)}, {"code": 612}]'
match $(code1) 200 命令详解
文法整体是以命令行文法为基础。一条指令由命令及命令参数构成。命令及命令参数之间以空白字符(空格或TAB)分隔。如果某个参数中包含空格或其他特殊字符,则可以:
类型系统在 linux shell 的命令行中,所有的输入输出都是字符串,基本上没有类型系统可言。这一点我们和 linux shell 有很大的不同。我们的脚本有完备的类型系统。 我们支持并仅支持 json 文法所支持的所有类型。基础类型包括:number (在 Go 语言中是 float64)、bool、string。复合类型包括 array(在 Go 语言里面是 slice,不是数组)和 dictionary/object (在 Go 语言中是 map/interface{})。特别需要注意的是,我们的类型系统里面没有 int 类型。null 不是空 array,也不是空 dictionary,而是空 object。 由于我们采用了命令行文法,所以表达类型和常规文法有一定的差异。比如 200、'200'、"200" 都表示同一个东西:number 类型的 200。表达字符串 "200" 必须用 '"200"' 或者 ""200""。 上面样例中的
是一个 array,如果我们用紧凑文法写,避免任何的空白字符,可以写成这样:
当然我们建议表达复合类型的时候,尽量还是用 '...' 来写,以保证可阅读性。 另外,考虑到 json 只有如下这些语法单元:
我们可以增加一条规则:
也就是说,以下这段文本:
等价于:
另外,对于那些明确接受 string 参数的指令,也可以省略 '"..."' 这样的外衣。 智能变量和 linux shell 类似,我们也支持
匹配(match)这几乎是这套 DSL 中最核心的概念。作为一门语言,有变量,自然会有赋值的概念。在这里的确有实现赋值的能力,但它不叫赋值,而是叫匹配。先看例子: match $(a.b) 1
match $(a.c) '"hello"' 这个例子的结果是,得到了一个变量 a,其值为 {"b": 1, "c": "hello"}。 到现在为止,你看到的 match 像赋值的一面。但是你不能对已经绑定了特定值的变量再次赋不同的值: match $(a.b) 1
match $(a.b) 1 #可以匹配,因为$(a.b)的值的确为1
match $(a.b) 2 #失败,1和2不相等 match 语句可以很复杂,如: match '{"c": {"d": $(d)}}' '{"c": {"d": "hello", "e": "world"}, "f": 1}' 一般地,match 命令的文法为: match <ExpectedObject> <SourceObject> 其中 支撑我们整个 DSL 的基石,正是匹配文法。这里你可以把所有支持的命令都看成是 bool 表达式,如果返回 true 则成功,返回 false 则失败。我们看下一开始你看到的例子的片段: ret 298
json '[{"code": $(code1)}, {"code": 612}]' 它表达的含义是,要求返回包的 StatusCode = 298,然后返回的 Response Body 必须能够匹配 ret #不带参数的 ret 仅仅发起请求,并将返回包存储在 $(resp) 变量中,不做任何匹配
match 298 $(resp.code)
match '["application/json"]' $(resp.header.Content-Type)
match '[{"code": $(code1)}, {"code": 612}]' $(resp.body) 子命令如同 linux shell 一样,我们可以在一条命令中,嵌入另一个命令,并把该命令的执行结果作为本命令输入的一部分。这种嵌入其他命令之中的命令,我们称为子命令。样例如下: host rs.qiniu.com `env QiniuRSHost`
match $(ekey1) |base64 Bucket:Key|
match $(ekey2) |base64 Bucket2:Key2| 和 linux shell 相比,我们多了一个子命令语法: 我们样例中的两个子命令 post http://rs.qiniu.com/delete/`base64 Bucket:Key`
match $(foo) {"ekey":`base64 Bucket:Key`} 为了达到这样的效果,我们可以想象一种子命令的实现手法: match $(__auto_var_1) `base64 Bucket:Key`
post http://rs.qiniu.com/delete/$(__auto_var_1)
match $(__auto_var_2) `base64 Bucket:Key`
match $(foo) {"ekey":$(__auto_var_2)} 也就是为每个子命令背地里生成一个自动变量,这样就可以让上下文相关的 marshal 能力,统一到由 “智能变量” 来支持。 HTTP API 测试请求包: req <Method> <Url> #可以简写为 post <Url> 或 get <Url> 或 delete <Url>
auth <AuthInterface>
header <Key1> <Value1>
header <Key2> <Value2>
body <BodyType> <Body> #可以简写为 form <FormBody> 或 json <JsonBody> 返回包测试: ret <Code> #参数可不指定。不带参数的 ret 仅仅发起请求,并将返回包存储在 $(resp) 变量中
header <Key1> <Value1>
header <Key2> <Value2>
body <BodyType> <Body> #可以简写为 json <JsonBody> 多案例支持一般测试案例框架都有选择性执行某个案例、多个案例共享 setUp、tearDown 这样的启动和终止代码。我们 DSL 也支持,如下: #代码片段1
...
case testCase1
#代码片段2
...
case testCase2
#代码片段3
...
tearDown
#代码片段4
... 这段代码里面,“代码片段1” 将被认为是 setUp 代码,“代码片段4” 是 tearDown 代码,所有 testCase 开始前都会执行一遍“代码片段1”,退出前执行一遍“代码片段4”。每个 case 不用写 end 语句,遇到下一个 case 或者遇到 tearDown 就代表该 case 结束。 运算能力目前,这套 DSL 的运算能力是比较有限的。基本上只能做字符串拼接(concat)。如下: match $(c) '"Hello $(a), $(b)!"' 如果我们希望做复杂运算,我设想未来有可能通过支持 match $(g) `calc max($(a), $(b), $(c)) + sin($(d)) + $(e)` 实现一个 考虑尽可能利用现有资源的话,我们可以考虑内嵌 lua 来实现 calc 支持。比如:
参考:
有了 calc $(a) < $(b) 在 assert $(a) < $(b) 流程控制等等,难道我们真要做一个图灵完备的语言?上面的运算能力的讨论已经有点脱离需求了(先实际使用中检验吧),我们就此打住吧。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论