2017-07-29 37 views
2

從來沒有想過,測試REST API將是很困難的,當我正在做fullstack時,我夢想着去REST,所以我沒有弄亂HTML和所有的東西,只有Behat節省了我的時間,它對測試html頁面有很大的幫助。正確的方法來測試REST API(PHP)

但是當涉及到測試API時,我頭痛。假設我有一些資源,例如用戶對話列表。

{ 
    "_links": { 
    "self": { 
     "href": "/api/v1/conversations" 
    } 
    }, 
    "_embedded": { 
    "items": [ 
     { 
     "id": 4, 
     "name": "Lana Smith", 
     "avatarUrl": "/static/avatars/597bd819d90f2568107586.png", 
     "createdAt": "2017-01-05T00:00:00+03:00", 
     "updatedAt": "2017-01-05T00:00:00+03:00", 
     "_links": { 
      "self": { 
      "href": "/api/v1/conversations/4" 
      } 
     } 
     }, 
     { 
     "id": 3, 
     "name": "Ian North [Support Agent]", 
     "avatarUrl": "/static/avatars/default.png", 
     "createdAt": "2017-01-04T01:00:00+03:00", 
     "updatedAt": "2017-01-04T01:02:00+03:00", 
     "_links": { 
      "self": { 
      "href": "/api/v1/conversations/3" 
      } 
     } 
     }, 
    ] 
    } 
} 

而作爲一個體面的人我有揚鞭文件,指出這個特殊的資源應該是這樣的,這些領域都是可選的,這些都是整數類型,有你有關係,等等等等第四

但是:

  • 我怎麼測試結構是這樣招搖的文檔說,這是
  • 我怎麼 測試數據是正確的(這樣的用戶有確切的他 個談話,不是別人的,和正確數量的人)

我在我的腦海幾種方法:

  • 只是測試JSON在對一個測試硬編碼的整個有效載荷,從反應過來。這裏的困難,有時我不知道例如createdAt/updatedAt在裝載過程中生成的確切值,頭像網址總是隨機的,除非默認等。
  • PHPUnit的使用和測試一切手動像:assertPropertyCount($響應,2,「_embedded.items)然後assertProperty等於(...)

如何做到這樣,它不走寫作產品代碼的時間延長了5倍

+1

只有當您可以預測更改零件的值時,您纔可以一次測試整個'JSON',否則按零件進行驗證:具有+1條消息,僅具有消息,查看通過生成的隨機字符串和日期等標識的已發送消息..你應該首先定義一些測試用例來知道你需要什麼驗證。首先計劃。使用Guzzle + goutte,不要忘記在你的功能上添加'@ api'標籤。至於斷言你可以選擇任何方式,我會用基本的php方法來定義我自己的。 – lauda

+0

如果您可以在Swagger/OAI的基礎上構建,您可以參加可以完成部分測試工作的圖書館,例如https://github.com/nabbar/SwaggerValidator-PHP – hakre

回答

0

我並不太熟悉PHP和圍繞它的工具堆棧,但通常對於API測試以及任何測試而言,它的確可以遠遠超過產品代碼,並且取決於你的JSON是如何生成的,這意味着它背後的邏輯,你可以寫出相當聰明的測試。

例如,我們假設您有一個獲取JSON輸入並生成JSON作爲輸出的API端點,這意味着很明顯,您知道它的邏輯。因此,您可以做的是,在您的代碼中包含一個測試JSON,並將測試JSON與輸出匹配,並在測試模式下測試調用API併發布JSON,並將其與輸出JSON斷言,在這種情況下,可以匹配所有動態字段。

除此之外,API的語言真的無所謂,可以在測試環境或臨時測試中實時測試,您可以使用諸如REST AssuredKarate之類的工具,或者更多。我相信有一些工具/框架也能很好地與PHP集成。