在我們目前的項(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ù),而不是你自己去定義它。