首页 文章

我应该在发出POST请求后验证发布的内容吗?

提问于
浏览
0

我正在尝试为基于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 .

1 回答

  • 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 等),并使服务器端逻辑测试专注于逻辑 .

相关问题