我正在尝试为基于HTTP REST API的Web应用程序编写一些测试。我曾经用GET请求验证通过POST请求上传的内容。但我意识到我已经使用其他请求测试了一个请求。换句话说,在大多数情况下,我的测试依赖于彼此。由于这种情况,每当我更改API规范时,我经常不得不更改间接受影响的所有测试。
例如,
testGetA() =>
expect(app.get('/A')).to.have.json('this', '{"foo":"bar"}')
testPostA() => {
expect(app.delete('/A')).to.have.status(200)
expect(app.post('/A', '{"foo":"bar"}')).to.have.status(200)
expect(app.get('/A')).to.have.json('this', '{"foo":"bar"}')
}
testPostA
依次使用DELETE,POST和GET来测试发布resource A
。但是,如果我更改GET /A
的规范,以便GET /A
以{"foo":"barzoo"}
回复,则我不仅要更改testGetA
,还要更改testPostA
。
答案 0 :(得分:1)
对于HTTP REST API的单元测试,如果POST
请求返回200 OK
,我认为您不需要通过GET
验证发布的内容。 HTTP API单元测试的目的是验证客户端和服务器之间的通信,而不是验证服务器端逻辑(比如发布的数据是否存储在数据库中)。
以下是一些细节原因:
POST /A
100%有效但GET /A
仅适用于90%的情况(由于某些服务器端错误),会发生什么情况。在这种情况下,POST /A
的测试用例有时会失败,这没有任何意义。POST /A
的服务器端逻辑只将数据保存在一个全局变量中,然后只返回200 OK
,会发生什么? (这种行为是错误的,因为第二个POST /A
请求将覆盖第一个请求)。在这种情况下,您的POST
- GET
验证会通过,但显然无法保证任何服务器端逻辑。总之,HTTP API的单元测试和服务器端逻辑的单元测试是两回事。最好让HTTP API测试只关注通信(如果POST /A
请求以正确的格式发送,它应该得到200 OK
。如果格式错误,它应该得到400 BAD REQUEST
等。),并使服务器端逻辑测试专注于逻辑。