使用 Robolectric 的参数化测试
在目前的项目中我们使用 Robolectric 为 Android 应用程序编写单元测试,它一直都干的不错。最近我需要编写一个测试用例,通过每次使用不同的测试数据,将同一个操作执行若干次,并由此断言:正确的动作能否发生是由数据决定的。
JUnit 对于这个情况提供了一个易于使用的选项,它叫做参数化测试-先定义测试数据,,然后使用参数化测试运行器来执行测试。这将创建一个该测试类的实例把测试数据中的每个元素传递到构造函数的参数中。
事实证明,Robolectric 有一个完全相同的 ParameterizedRobolectricTestRunner
(稍微调整以适应 Robolectric),而且它对于我的测试:验证应用程序从外部服务提供者接收到不同的错误代码的行为,做的非常好
@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 错误代码
});
}
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 响应从服务包含定义的错误代码
Robolectric.addPendingHttpResponse(HttpStatus.SC_OK, buildFakeServiceResponse(errorCode));
// 联系服务
mService.contactService();
// 使用 awaitility 等到错误消息显示给用户
// 然后断言该错误代码与期望一致
await().until(getDisplayedErrorMsg(), is(expectedErrorMsg));
}
该测试用例将被执行 6 次,一旦遍历测试数据的每个元素,就会将打印的错误消息与特定错误代码定义的错误消息相比较。当创建测试报告时,每一个测试运行都将视为其自身的测试用例。
添加了 name
参数到 Parameters 注解上将会整理测试结果。作为测试运行结果显示,测试用例的名称将会像下面这种情况下
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]
...
如需深入理解请查阅 JUnit Theories 以及 junit-quickcheck ,一个好的生成测试数据的方法是在 JUnit 中自动生成(Robolectric 也差不多),而不是由你自己定义。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论