2017-09-03 53 views
3

我在服務類中創建了幾個方法,通過使用API​​ POST請求通過Guzzle連接到外部服務/提供程序。phpunit - 假的API響應或真正的響應連接到服務?

我喜歡使用phpunit進行測試 - 我應該使用假的HTTP Json響應而不連接到服務,或者它應該連接到服務以獲得服務的真實響應?

+0

模擬服務允許您返回各種回覆,特別是難以測試的回覆(如錯誤)。 –

+0

@NigelRen你應該回答更多的細節和如何模擬服務 –

+0

如果你有一些代碼,它可能會有所幫助,不知道該回答什麼。嘗試瀏覽http://guzzle3.readthedocs.io/testing/unit-testing.html。 –

回答

2

測試的一個共同信條是「不要嘲笑你不擁有的東西」。嘲笑這些API調用使得你的測試不太可靠,並且會給你一種錯誤的安全感,因爲你可能會得到誤報

例如,當API意外地引入了重大更改時,您的測試將變爲綠色,並且一旦部署到生產中,您將最終注意到有問題。這可能是你想要測試的結果。

當您測試真正的API時,您會感受到可靠性。由於服務中斷或超時,您的測試經常失敗嗎?如果是這樣,你可以引入措施,如重試機制,斷路器或將API調用與應用程序的其他部分解耦。

當你模擬API時,你可以告訴的是你的代碼根據服務的規範(可能是過時的)來運行。沒關係,但不像依靠實際的服務那麼有用。

你可以做的是使用組來分別運行這些測試。這樣可以很容易地包含/排除這些可能很慢並且有時會在剩餘測試中出現片狀的測試。這也有助於限制速率,例如只需在關鍵分支上運行這些測試。

+0

您對真實API的測試做了很好的說明。在生產過程中 - 是否有辦法自動每x小時運行一次測試 - 這將確保真正的API服務仍在運行? –

+1

是的,除了進行基於分支的測試之外,我知道他們在間隔期間針對生產系統運行測試的地方。您必須小心以某種方式標記數據,以便能夠從真實數據中辨別出它們,特別是在進行電子商務時。例如,您可以使用Jenkins設置計劃作業,然後在請求中使用特殊的X-TEST標頭,該標頭由應用程序識別。 – dbrumann

+1

如果您的CI/CD服務器不支持預定作業,您也可以使用運行測試套件的cron作業來執行此操作。再次,如果你這樣做,要小心,例如操作會改變數據庫狀態(或者更糟的是清理數據庫)。我建議有一個單獨的測試套件,以減少有害副作用的風險。 – dbrumann