摘要:解決這些問題并且練習(xí)這些調(diào)用的一個(gè)絕妙方法是,使用一個(gè)很好的一個(gè)測(cè)試雙庫通用程序。當(dāng)服務(wù)器做出響應(yīng)時(shí),會(huì)使用響應(yīng)數(shù)據(jù)執(zhí)行回調(diào)方法。目前為止,的威力真的很贊。
測(cè)試與API交互的HTTP調(diào)用是一件令人生厭的復(fù)雜事情。測(cè)試一個(gè)真實(shí)的Web服務(wù)器時(shí),一大堆問題隨之產(chǎn)生:脆性測(cè)試(brittle test,因?yàn)榫W(wǎng)絡(luò)或API本身的問題而導(dǎo)致的測(cè)試失?。?、速度減慢測(cè)試(slow test,每一次HTTP調(diào)用都要花費(fèi)好幾秒)和不完全測(cè)試(“如何觸發(fā)一個(gè)速率限制越界用例?想一想,我只希望速率限制會(huì)起作用……”)。
像Android這樣的平臺(tái)HTTP理應(yīng)是異步調(diào)用,問題會(huì)變得更加復(fù)雜。如果在這些測(cè)試組合中添加計(jì)時(shí)器,那么你就準(zhǔn)備好在測(cè)試API調(diào)用上認(rèn)輸吧。
解決這些問題并且練習(xí)這些HTTP調(diào)用的一個(gè)絕妙方法是,使用一個(gè)很好的Mockito(一個(gè)Java測(cè)試雙庫 double library)通用程序:ArgumentCaptor。
ArgumentCaptor與混合測(cè)試雙有幾分相似;有點(diǎn)類似存根(stub),也有點(diǎn)類似偵聽程序(spy),但不完全是其中任何一個(gè)??梢允褂脜?shù)捕獲器捕獲并存儲(chǔ)傳給mock/stub的參數(shù)。然而這里真正的亮點(diǎn)是對(duì)捕獲的參數(shù)進(jìn)行方法調(diào)用,對(duì)于像Retrofit回調(diào)有很大幫助。
譯注:Retrofit是一個(gè)Android & Java的類型安全REST客戶端。
有了Retrofit,我們可以發(fā)起一個(gè)API調(diào)用并提供一個(gè)回調(diào)方法。當(dāng)服務(wù)器做出響應(yīng)時(shí),Mockito會(huì)使用響應(yīng)數(shù)據(jù)執(zhí)行回調(diào)方法。
下面這些代碼使用Github API查詢用戶代碼倉庫:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
getApi().repositories( |
這里有三個(gè)我們想要測(cè)試的用例:理想路徑(happy path,獲取一些代碼倉庫并把傳遞給適配器)、錯(cuò)誤路徑(error path,向用戶提示服務(wù)器錯(cuò)誤)、特殊用例(special case, 向用戶提示沒有代碼倉庫錯(cuò)誤)。
如果你的測(cè)試依賴于在真實(shí)的API服務(wù)器,那么第二和第三個(gè)用例會(huì)很復(fù)雜。我了解到最近GitHub有一些DDOS問題,但你肯定不能依賴它們來測(cè)試你的錯(cuò)誤用例!
然而我們可以通過ArgumentCaptor捕獲回調(diào)參數(shù),進(jìn)而完全控制發(fā)送的數(shù)據(jù)。
看一下對(duì)理想路徑的測(cè)試(我用的是Robolectri,建議你也嘗試一下):
1 2 3 4 5 6 7 8 9 |
Mockito.verify(mockApi).repositories(Mockito.anyString(), cb.capture());
?
|
captor(cb)捕獲到回調(diào),調(diào)用getValue()方法以后,通過success方法向它傳遞一些偽對(duì)象(dummy object)。
你可能會(huì)感嘆“啊哈(原來可以這么簡(jiǎn)單)”。呵呵,如果沒有也沒關(guān)系。接下來可以看一下對(duì)錯(cuò)誤路徑的測(cè)試:
1 2 3 4 5 |
Mockito.verify(mockApi).repositories(Mockito.anyString(), cb.capture());
?
|
像之前一樣,我們捕獲了回調(diào)。但是這一次我們調(diào)用了failure方法,它模擬了一個(gè)API錯(cuò)誤。如果我們需要更有針對(duì)性的錯(cuò)誤處理(例如:如果返回狀態(tài)是401,就重定向再登陸;如果是500, 彈出一條普通的系統(tǒng)錯(cuò)誤消息),可以通過創(chuàng)建合適RetrofitError對(duì)象作為failure調(diào)用的參數(shù)。
目前為止,ArgumentCaptor的威力真的很贊。我們完全控制了捕獲到的對(duì)象,并且能夠給這些對(duì)象設(shè)置任意的數(shù)據(jù)或者觸發(fā)任意想要測(cè)試的錯(cuò)誤。
為了讓內(nèi)容更加豐富,下面是對(duì)一個(gè)特殊用例的測(cè)試:
1 2 3 4 5 6 7 8 |
Mockito.verify(mockApi).repositories(Mockito.anyString(), cb.capture());
?
|
(你可以在GitHub上找到示例的全部源碼和工程文件)。
有一個(gè)特殊細(xì)節(jié)要注意:如果在聲明捕獲器時(shí)使用了Mockito注解,
1 2 |
@Captor
|
請(qǐng)確保在設(shè)置中的某個(gè)地方添加了下面代碼:
1 |
MockitoAnnotations.initMocks( |
這種測(cè)試方法完全符合書中提到的所有特點(diǎn):快速、健壯、易于使用。我們還可以通過它很容易地測(cè)試項(xiàng)目中很少出現(xiàn)的邊緣情況(會(huì)話超時(shí)、服務(wù)器維護(hù)、特殊值),確保我們的應(yīng)用正常運(yùn)行。
雖然本文示例是專門針對(duì)某種棧(Android、Robolectric、Retrofit、Mockito),但是類似的方法幾乎適用于任何應(yīng)用。
祝測(cè)試愉快!
原文 Reliable API testing for Android with Retrofit and Mockito
翻譯 Peter Pan
via www.importnew
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/8680.html
摘要:寫單元測(cè)試時(shí),應(yīng)該把這些依賴隔離,讓每個(gè)單元保持獨(dú)立。以上的各種原因,都會(huì)影響單元測(cè)試的結(jié)果。在單元測(cè)試的基礎(chǔ)上,將相關(guān)模塊組合成為子系統(tǒng)或系統(tǒng)進(jìn)行測(cè)試,稱為集成測(cè)試??梢钥吹?,單元測(cè)試速度比集成測(cè)試,也叫測(cè)試要快,并且開發(fā)成本也是最低。 showImg(/img/remote/1460000006811144); 原文鏈接:http://www.jianshu.com/p/bc996...
摘要:寫在前面因個(gè)人能力有限,可能會(huì)出現(xiàn)理解錯(cuò)誤的地方,歡迎指正和交流關(guān)于單元測(cè)試通常一個(gè)優(yōu)秀的開源框架,一般都會(huì)有很完善的單元測(cè)試。 寫在前面 因個(gè)人能力有限,可能會(huì)出現(xiàn)理解錯(cuò)誤的地方,歡迎指正和交流! 關(guān)于單元測(cè)試 通常一個(gè)優(yōu)秀的開源框架,一般都會(huì)有很完善的單元測(cè)試。 舉個(gè)例子: showImg(/img/remote/1460000006767410); 不好意思,我調(diào)皮了 :) R...
閱讀 1827·2021-10-18 13:30
閱讀 2702·2021-10-09 10:02
閱讀 3050·2021-09-28 09:35
閱讀 2147·2019-08-26 13:39
閱讀 3590·2019-08-26 13:36
閱讀 2011·2019-08-26 11:46
閱讀 1195·2019-08-23 14:56
閱讀 1778·2019-08-23 10:38