使用 Robolectric 的参数化测试

发布于 2024-10-26 07:04:34 字数 2377 浏览 4 评论 0

在目前的项目中我们使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

蓝色星空

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

linfzu01

文章 0 评论 0

可遇━不可求

文章 0 评论 0

枕梦

文章 0 评论 0

qq_3LFa8Q

文章 0 评论 0

JP

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文