httpcases是一款golang开发的、通过编写接口测试脚本执行接口自动化测试的工具。
- 测试脚本简单,容易编写,学习成本低,无需编程基础;
- 支持函数功能,轻松处理测试接口返回数据;
- 函数功能丰富,包含字符串处理、数字处理、文件处理、断言函数等;
- 丰富的断言函数支持;
- 支持JavaScript编写扩展插件;
brew install roseboy/tap/httpcase
pip install httpcase
//1. 下载源码
git clone https://gitee.com/roseboy/httpcase.git
//2. 编译源码
//编译环境 go version go1.13.5 darwin/amd64
cd httpcase
go build -o hc main.go
//国内网络不好请设置代理
go env -w GOPROXY=https://goproxy.cn,direct
保存以下代码为文件 apitest.hc
//声明一个测试用例,名字叫做 ApiTest
@ApiTest
//使用POST方法请求一个url
POST http://localhost:8080/test
//设置请求头
user-agent: httpcasev1.0
x-requested-with: XMLHttpRequest
cookie: username=admin; name=value;
//设置请求体
{
"name":"王二丫",
"sex":"男",
"age":18
}
//断言函数
//判断http状态是否等于200
assert ${res.status} == 200
//判断返回结果的name字段是否等于tom
assertEq ${res.body.name} tom
//以字符串格式打印返回结果
print ${res.text}
运行以下命令执行测试用例
hc run apitest.hc
保存以下代码为文件 httpcase_helloworld.hc
//fileName httpcase_helloworld.http
!env test
!envSet test apiUrl http://127.0.0.1:8000
!envSet dev apiUrl http://localhost:80
//全局token
!header token 123456
@添加用户
POST ${apiUrl}/user
{
"name":"王二丫",
"sex":"男",
"age":18
}
assert ${res.status} == 200
print ${res.body.id}
set userId ${res.body.id}
print ${res.text}
@查询用户
GET ${apiUrl}/user/${userId}
assert ${res.status} == 200
assertEq ${res.body.name} 王二丫
print ${res.text}
@修改用户
POST ${apiUrl}/user/${userId}
{
"id":${userId},
"name":"王二丫",
"sex":"男",
"age":20
}
assert ${res.status} == 200
print ${res.text}
@查询用户是否修改成功
GET ${apiUrl}/user/${userId}
assert ${res.status} == 200
assertEq ${res.body.age} 20
print ${res.text}
@删除用户
DELETE ${apiUrl}/user/${userId}
assert ${res.status} == 200
print ${res.text}
@查询用户是否删除成功
GET ${apiUrl}/user/${userId}
assert ${res.status} == 404
print ${res.text}
命令行执行以下命令,启动一个demo接口服务
hc demo -p 8000
打开新的命令行,执行以下命令,运行测试用例
hc run httpcase_helloworld.hc -o report.html
执行完成后,控制台打印如下执行结果,同时生成测试报告文件 report.html。
---------------------------------------------------------------------
Test Result (Total:6, Pass:6, Fail:0, Skip:0, Duration:1ms)
---------------------------------------------------------------------
[1] [Pass] 添加用户 POST http://127.0.0.1:8000/user
[2] [Pass] 查询用户 GET http://127.0.0.1:8000/user/1622822023
[3] [Pass] 修改用户 POST http://127.0.0.1:8000/user/1622822023
[4] [Pass] 查询用户是否修改成功 GET http://127.0.0.1:8000/user/1622822023
[5] [Pass] 删除用户 DELETE http://127.0.0.1:8000/user/1622822023
[6] [Pass] 查询用户是否删除成功 GET http://127.0.0.1:8000/user/1622822023
//TODO:
//TODO:
//TODO:
//TODO:
//TODO:
//TODO:
//TODO:
//TODO:
//TODO:
//TODO:
参数 | 作用 |
---|---|
run | 运行测试用例 |
demo | 启动一个示例接口服务 |
version | 打印版本信息 |
help | 显示帮助 |
{
"cookie":{ //Cookies
"JSESSIONID":"d6f775bb0765885473b0cba3a5fa9c12",
"_xsrf":"AWgoSoiwRqFW1p431145342bOJ1X8ZfeQ",
...
},
"header":{ //响应header
"Cache-Control":"no-cache, no-store, must-revalidate, private, max-age=0",
"Content-Type":"application/json; charset=utf-8",
"Date":"Sun, 04 Apr 2021 13:24:40 GMT",
"Pragma":"no-cache",
"Referrer-Policy":"no-referrer-when-downgrade",
"Server":"CLOUD ELB 1.0.0",
...
},
"length":100, //响应体长度
"protocol":"HTTP/2.0", //协议版本
"status":200, //http响应状态码
"time":318, //请求耗时,单位:ms
"text":"", //响应内容文本形式
"body":{} //响应内容json对象形式
}
TODO:
TODO:
函数 | 描述 | 参数 |
---|---|---|
set | 设置一个变量 | set name value |
env | 设置环境 | env prod |
envSet | 设置一个环境变量 | envSet prod name value |
callback | 测试完成后回调接口 | callback url |
callbackWithFunction | 测试完成后回调接口,并且使用js函数处理回调请求体 | callbackWithFunction funName url |
loadData | 加载json数据,相当于批量set变量 | loadData jsPath |
import | 导入js插件 | import name jsPath |
header | 设置请求头 | header key value |
body | 设置请求体 | body jsonBody |
param | 设置请求参数 | param name value |
file | 设置上传文件 | file field path |
allowRedirect | 设置允许重定向 | allowRedirect false |
打印 | print value | |
sleep | 延时(毫秒) | sleep time |
while | 循环条件判断 | while val1 opt val2 |
函数 | 描述 | 参数 |
---|---|---|
assert | 断言 | assert val1 opt val2 |
assertEq | 断言-相等 | assertEq val1 val2 |
assertNe | 断言-不等 | assertNe val1 val2 |
assertLt | 断言-小于 | assertLt val1 val2 |
assertGt | 断言-大于 | assertGt val1 val2 |
assertLe | 断言-小于等于 | assertLe val1 val2 |
assertGe | 断言-大于等于 | assertGe val1 val2 |
assertContains | 断言-包含 | assertContains str subStr |
assertMatch | 断言-正则匹配 | assertMatch str regxStr |
assertBefore | 断言-在之前 | assertBefore date1 date2 |
assertAfter | 断言-在之后 | assertAfter date1 date2 |
assertEmpty | 断言-为空 | assertEmpty str |
assertNotEmpty | 断言-不为空 | assertNotEmpty str |
函数 | 描述 | 参数 |
---|---|---|
len | 字符串长度 | len str |
replace | 字符串替换 | replace str old new |
toLower | 字符串转小写 | toLower str |
toUpper | 字符串转大些 | toUpper str |
trim | 去除左右两边不可见字符 | trim str |
trimLeft | 去除左边不可见字符 | trimLeft str |
trimRight | 去除右边不可见字符 | trimRight str |
match | 字符串是否匹配 | match str regxStr |
indexOf | 字符串查找 | indexOf str substr |
subStr | 根据字符索引截取子字符串 | subStr str indexStr indexStr2 |
subStr2 | 根据字符截取子字符串 | subStr2 str beginStr endStr |
concat | 连接两个字符串 | concat str1 str2 |
函数 | 描述 | 参数 |
---|---|---|
add | 加 | add num1 num2 |
sub | 减 | sub num1 num2 |
multiply | 乘 | multiply num1 num2 |
divide | 除 | divide num1 num2 |
mod | 取余 | mod num1 num2 |
函数 | 描述 | 参数 |
---|---|---|
readFile | 读取文件 | readFile filePath |
writeFile | 写入文件 | writeFile filePath text |
appendFile | 追加写入文件 | appendFile filePath text |