推荐一款声明式 HTTP 自动化测试框架
编写完 API 接口后,我们需要测试其功能。手动一条一条用 Postman 和 curl 测试也是一种方式,但是缺点显而易见。 严谨精明的程序员常常会编写一些测试程序来完成这项工作。 一般是生成请求数据,再通过 http 发送请求,最后断言响应是否匹配预期。
下面是就注册和修改用户信息接口的测试举例, Node.js 下实现是这样的:
const { assert } = request('chai')
let registJohnToken
it('regist', function() {
return request(app)
.post('/api/users')
.set('Accept', 'application/json')
.send({
user: {
email: 'john@jacob.com',
password: 'johnnyjacob',
username: 'johnjacob'
}
})
.expect(200)
.then(response => {
let user = response.body.user
assert.isDefined(user)
assert.equal(user.email, 'john@jacob.com')
assert.equal(user.username, 'johnjacob')
assert.isDefined(user.token)
registJohnToken = user.token
})
});
it('update user data', function () {
return request(app)
.put('/api/user')
.set('Accept', 'application/json')
.set('Authorization', 'Token ' + registJohnToken)
.send({
user: {
username: 'john'
}
})
.expect(200)
.then(response => {
let user = response.body.user
assert.isDefined(user)
assert.equal(user.username, 'john')
})
})
如何使用 htte 来实现这两个测试呢?
首先我们需要编写一个配置文件 .htte.yaml
来描述接口
url: http://localhost:3000/api
apis:
register:
method: post
uri: /users
updateUser:
method: put
uri: /user
然后我们编写测试 user.yaml
units:
- describe: register user
api: register
name: registerJohn
req:
body:
user:
email: john@jacob.com
password: johnnyjacob
username: johnjacob
res:
body:
user:
email: john@jacob.com
username: johnjacob
token: !@exist
- describe: update user data
api: updateUser
req:
headers:
Authorization: !$concat ['Token', ' ', !$query $$registerJohn.res.body.user.token]
body:
user:
username: john
res:
body:
user: !@object
username: john
改写完成.
我们可以使用 htte 命令行工具运行测试
$ htte # 执行测试, 如果找不到命令,可以使用 npm i -g htte 安装
RunUnits:
user:
regist user:
✓
update user data:
✓
上面的接口截取自 realworld项目。 该项目采用 htte 进行接口测试,可以作为例子学习如何使用 htte。
特性
- 使用声明的方式 (YAML) 编写测试
- 不与后端开发语言耦合
- 无技能要求,不需要会编程也能编写测试
- 直白描述请求需要的数据和响应返回的数据, 简单,易理解,已编写
- 可以使用插件自定义生成请求数据及断言响应数据,提供了灵活性又不失简洁
- 提供 jsonpath 变量机制处理测试接口间的数据耦合,简单方便安全
项目开源 sigoden/htte