鍍金池/ 教程/ Android/ 用Robolectric進(jìn)行參數(shù)化測(cè)試
原文鏈接
Issue #185
Issue #181
Issue #161
Issue #192
Issue #174
Issue #190
RecyclerView FastScroll – Part 2
僅作為Android 調(diào)試模式工具的Stetho
Issue #150
Issue #167
Issue #180
Issue #151
Issue #188
Issue #159
Issue #189
Issue #160
Issue #168
Issue #146
Issue #173
Issue #198
Issue #179
延期的共享元素轉(zhuǎn)換(3b)
Yahnac:RxJava Firebase&內(nèi)容提供
Issue #162
游戲性能:規(guī)劃限定條件
分析清單:測(cè)量和尋找哪些方面
Issue #148
Issue #166
Issue #158
Issue #178
Issue #193
Issue #145
Issue #170
Issue #169
Issue #196
Issue #186
Issue #172
Issue #171
附加Android工件和Gradle的檔案
Issue #147
自定義顏色范圍
根據(jù) Material 設(shè)計(jì)導(dǎo)航制圖工具樣式
Issue #187
Issue #184
Issue #175
在Android Lollipop上使用JobScheduler API
Android性能案例追蹤研究
使用安卓Wear API創(chuàng)建watchface—第2部分
在谷歌市場(chǎng)上創(chuàng)造更好的用戶體驗(yàn)
映射與包的神秘關(guān)系
Issue #165
用Robolectric進(jìn)行參數(shù)化測(cè)試
Issue #155
Issue #149
MVC / MVP中的M -模型
歡迎為 Android 和 iOS 嵌入 API
Issue #164
Android UI 自動(dòng)化測(cè)試
Issue #182
Issue #191
Issue #183
Issue #163
Issue #157
響應(yīng)式編程(Reactive Programming)介紹
Issue #197
原文鏈接
Issue #153
Issue #152
Issue #176
原文地址
Android Material 支持庫:Electric Boogaloo的提示與技巧
Issue #156
Issue #154
Android的模糊視圖
Issue #194
Issue #177
Issue #195
針對(duì)Jenkins的谷歌商店安卓出版插件

用Robolectric進(jìn)行參數(shù)化測(cè)試

在我們目前的項(xiàng)目中,我們使用 Robolectric 為 Android 應(yīng)用程序編寫單元測(cè)試,并且它一直都很好用。最近我需要編寫一個(gè)操作需要執(zhí)行幾次并且需要用到不同的測(cè)試數(shù)據(jù)的一個(gè)測(cè)試用例,還要斷言正確的行為發(fā)生取決于數(shù)據(jù)。

對(duì)于所謂的參數(shù)化測(cè)試,Junit 具有一個(gè)易于使用的選項(xiàng),其中一項(xiàng)里面定義了測(cè)試數(shù)據(jù),然后可以使用參數(shù)化測(cè)試運(yùn)行器來執(zhí)行測(cè)試。這將為測(cè)試數(shù)據(jù)的每一個(gè)元素創(chuàng)建測(cè)試類的一個(gè)實(shí)例,其中測(cè)試數(shù)據(jù)被傳遞給構(gòu)造函數(shù)。

事實(shí)證明,Robolectric 有一個(gè)完全一樣的參數(shù)化 Robolectric 測(cè)試運(yùn)行器(但略微有些調(diào)整,以符合Robolectric),并且在驗(yàn)證應(yīng)用程序接收來自外部服務(wù)提供商的不同的錯(cuò)誤代碼的行為測(cè)試時(shí)工作的非常好。

    @RunWith(ParameterizedRobolectricTestRunner.class)
    public class ContactServiceTest {

        @ParameterizedRobolectricTestRunner.Parameters(name = "ErrorCode = {0}")
        public static Collection<Object[]> data() {
            return Arrays.asList(new Object[][]{
                    {105, 105_ERROR_MSG},
                    {113, 113_ERROR_MSG},
                    {114, 114_ERROR_MSG},
                    {134, 134_ERROR_MSG},
                    {137, 137_ERROR_MSG},
                    {999, DEFAULT_ERROR_MSG} // Bogus error code
            });
        }

        private int errorCode;
        private String expectedErrorMsg;

        public ContactServiceTest(int errorCode, String errorMsg) {
            this.errorCode = errorCode;
            this.expectedErrorMsg = errorMsg;
        }

        @Test
        public void when_known_error_code_is_received_from_service_correct_error_msg_is_displayed_to_user() {
            // HTTP response from service contains defined error code
            Robolectric.addPendingHttpResponse(HttpStatus.SC_OK, buildFakeServiceResponse(errorCode)); 
            // Contact the service
            mService.contactService();
            // Use awaitility to wait until error message is displayed to user
            // then assert that the error message is correct
            await().until(getDisplayedErrorMsg(), is(expectedErrorMsg));
        } 

代碼將執(zhí)行測(cè)試用例六次,依次為測(cè)試數(shù)據(jù)的每個(gè)元素進(jìn)行測(cè)試,并將顯示的錯(cuò)誤消息看成是特定錯(cuò)誤代碼定義的錯(cuò)誤信息。每個(gè)測(cè)試運(yùn)行將被視為自己的測(cè)試用例并作為報(bào)告進(jìn)行創(chuàng)建。在參數(shù)注釋中添加名稱參數(shù),這樣可以重新整理測(cè)試結(jié)果。正如顯示的測(cè)試運(yùn)行的結(jié)果,測(cè)試用例的名字在這種情況下將是

when_known_error_code_is_received_from_service_correct_error_msg_is_displayed_to_user[ErrorCode = 105]
    when_known_error_code_is_received_from_service_correct_error_msg_is_displayed_to_user[ErrorCode = 113]
    when_known_error_code_is_received_from_service_correct_error_msg_is_displayed_to_user[ErrorCode = 114]
    ... 

對(duì)于進(jìn)一步檢驗(yàn) Junit 理論啟示或者說是 Junit快速檢查,一種很好的方法是在你的 Junit(也就是 Robolectric)測(cè)試中生成測(cè)試數(shù)據(jù),而不是你自己去定義它。