2017-05-03 58 views
0

我正在嘗試爲基於HTTP REST API的Web應用程序編寫一些測試。我用GET請求驗證通過POST請求上傳的內容。但是我意識到我已經使用其他請求測試了一個請求。換句話說,在大多數情況下,我的測試依賴於彼此。由於這種情況,每當我更改API規範時,我經常需要更改所有間接受到影響的測試。我應該在發出POST請求後驗證發佈的內容嗎?

例如,

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"},我不僅要testGetAtestPostA改變。

+0

能否請您說明您所使用的測試套件中的語言? – DaSourcerer

+0

@DaSourcerer目前我沒有任何網絡應用程序。我曾經使用Java,JUnit和Mockito。但這一次,我正在考慮使用Javascript,Mocha,Chai和[Chakram](http://dareid.github.io/chakram/jsdoc/index.html)。 – dyong

回答

1

對於HTTP REST API的單元測試,如果POST請求返回200 OK,我認爲您不需要通過GET驗證發佈的內容。 HTTP API單元測試的目的是驗證客戶端和服務器之間的通信,而不是驗證服務器端邏輯(比如發佈的數據是否存儲在數據庫中)。

這裏有一些細節的原因:

  1. 會發生什麼,如果POST /A 100%的工作,但(由於一些服務器端錯誤)GET /A作品僅在90%的情況下。在這種情況下,POST /A的測試用例有時會失敗,這沒有任何意義。
  2. 會發生什麼,如果的POST /A服務器端邏輯只在一個全局變量保存數據,然後就返回200 OK? (這種行爲是錯誤的,因爲第二個POST /A請求將覆蓋第一個)。在這種情況下,您的驗證將通過,但顯然它不能保證任何服務器端邏輯。
  3. 由於測試用例依賴於服務器端狀態。在多個測試執行之間或者多個測試用例之間會發生衝突,當測試用例數量增加時這將變得非常複雜。

總之,HTTP API的單元測試和服務器端邏輯的單元測試是兩個不同的東西。這是更好地使HTTP API的測試只專注於通信(如果POST /A請求在正確的格式發送,它應該得到200 OK。如果格​​式是錯誤的,它應該得到400 BAD REQUEST等),使服務器端邏輯測試注重邏輯。

+0

謝謝你的詳細解答!我覺得我正在嘗試通過多個層次編寫集成測試。正如你所說的,我應該認識到測試網絡層並分別測試邏輯層。 – dyong