在Ruby中,使用Cucumber,我应该模拟对Web服务的调用吗?

在Ruby中,使用Cucumber,我应该模拟对Web服务的调用吗?,ruby,mocking,cucumber,Ruby,Mocking,Cucumber,全部, 我正在使用Cucumber对Ruby命令行实用程序进行验收测试。此实用程序从Web服务中提取数据 我知道Cucumber用于验收测试,并测试整个堆栈,但我仍然需要提供来自Web服务的一致回复 我应该嘲笑Web服务吗?如果是,如何进行?这里最好的方法是什么 干杯, Gordon我对Ruby或Cucumber不太熟悉,所以我只能给你一个与你的问题相关的非常笼统的答案,实际上问题多于答案 web服务的可靠性有多高?如果它们宕机太多,您的测试会不时失败,没有什么比追查测试失败的原因而发现又是这

全部,

我正在使用Cucumber对Ruby命令行实用程序进行验收测试。此实用程序从Web服务中提取数据

我知道Cucumber用于验收测试,并测试整个堆栈,但我仍然需要提供来自Web服务的一致回复

我应该嘲笑Web服务吗?如果是,如何进行?这里最好的方法是什么

干杯,
Gordon

我对Ruby或Cucumber不太熟悉,所以我只能给你一个与你的问题相关的非常笼统的答案,实际上问题多于答案

  • web服务的可靠性有多高?如果它们宕机太多,您的测试会不时失败,没有什么比追查测试失败的原因而发现又是这个月的那个时候更令人恼火的了
  • 您的web服务能承受测试带来的冲击吗?如果您有几个开发人员经常运行这些测试,并且您的web服务位于合作伙伴公司的服务器上,他们可能不喜欢您针对他们进行测试
  • 您信任他们的输出吗?对我来说,不模拟依赖关系的最大原因是,如果我不知道我将从服务中获得什么样的数据。如果我使用的服务有很好的文档记录并且易于理解,我通常不会嘲笑它们,但是如果它们不完全清楚或者经常更改,我建议对它们进行测试
  • 模拟依赖项有多难?替换依赖项并不总是那么容易,尤其是在之后添加测试代码时。幸运的是,在动态语言中,它通常比Java简单得多。我仍然会考虑建立一个模拟服务需要多少工作来回应你真正想要的答案。
  • 我从模拟中获得了多少速度优势?集成测试速度很慢,模拟web服务依赖关系会使测试运行得更快,快多少?我不知道,但这可能很重要

<>这只是几点,但至少最后三个我总是在选择嘲讽或不嘲笑之前考虑。

所以经过一点思考!然后我在谷歌上搜索了一下。这正是我需要的

退房-尤其是幻灯片17

这很容易-在不到2个小时的时间里,我成功地设置了它,重写了我的测试,让所有的东西都通过了,并将它们全部检查回git hub


其他人

模拟Web服务

我会在应用程序中为对webservice的调用编写一个包装器。
伪代码中的示例

CallWebService (action, options,...) {
    // Code for connectiong to Webservice
}
然后你只需要模仿这个函数,就像你想要其他函数一样

CallWebService (action, options,...) {
    return true;
}
通过这种方式,您可以模拟Web服务,而不必担心它是Web服务或数据库连接或其他任何东西。你可以让它返回真的或者别的什么

测试代码如何处理来自Web服务的响应

为了使这个想法更进一步,使您的测试更加强大,您可以使用某种测试参数或环境参数来控制mockoffwebservice方法中发生的事情。然后您可以成功地测试代码如何处理来自web服务的不同响应
同样在伪代码中:

CallWebService (action, options,...) {
    if TEST_WEBSERVICE_PARAMETER == CORRUPT_XML
        return "<xml><</xmy>";
    else if TEST_WEBSERVICE_PARAMETER == TIME_OUT
        return wait(5000);
    else if TEST_WEBSERVICE_PARAMETER == EMPTY_XML
        return "";
    else if TEST_WEBSERVICE_PARAMETER == REALLY_LONG_XML_RESPONSE
        return generate_xml_response(1000000);
}
以此类推,你就明白了。
请注意,尽管我所有的例子都是否定的测试用例,但这当然也可以用来测试肯定的测试用例

请注意,这是我对类似问题的回答的副本:


祝你好运

+1;我和你一样,只是“测试”web服务并不总是“启动”,我当然不会针对“生产”web服务测试我的代码。感谢ponzao的指导。对于决定是否模仿非常有用。但是看起来已经有人为我做了艰苦的工作。有关详细信息,请参阅我自己关于FakeWeb的答案。很好,你让它工作了!我一定要查一下FakeWeb。
should_raise_error_on_empty_xml_response_from_webservice() {
    TEST_WEBSERVICE_PARAMETER = EMPTY_XML;
    CallWebService(action, option, ...);
    assert_error_was_raised(EMPTY_RESPONSE_FROM_WEBSERVICE);
    assert_written_in_log(EMPTY_RESPONSE_LOG_MESSAGE);
}
...