手头上的一个项目,是以另外一个系统的webservice做为底层基础。
里面大约有50的操作,最终都要调用这些 web service。
大约有200个test case, 跑完一边居然要15~ 30分钟。因为调用一次WS,大约25秒左右。而且随着远程webservice 服务器的性能问题,这个时间还在增加。
程序员感觉很麻烦。因为调试的时候,如果远程 Webservice出了问题,本地也运行不了。
而且从过去的经验来看,这个webservice 不是很稳定。大约有3~ 5% 的出错率(网络原因造成)。很多时候需要跑很多次,才会明确结果。
所以这个项目越到后来,程序员就越不乐意运行单元测试, 草草的改了代码,最多运行一下对应的 model/controller spec, 然后提交。 最近一个月几乎没有跑过全部的webservice. 所以感觉非常麻烦。
另外一个原因, webserivce 的测试不好写。 不想test database那样可以轻易rollback, webservice 上的操作都需要手动的回复。某个 test case 提交一个POST增加测试数据,那么就必须在这个test case运行完之后删掉对应的数据。如果运行顺利还好说,不顺利的话,程序遇到了异常,直接跳过“删除对应数据”这一步,直接跳到下一个。
难于测试的程序就难于开发,所以项目 就越来越难不好做。
所以今天开始,决心引入mock object,最大限度的解决这个问题。
原则就是:
The mock object should also have exactly the same methods(public) that the original object has.
步骤: 视系统而定。有的系统是java,有的是rails, 这个系统是rails/rspec, 所以...
先找到一个最核心的resource(调用远程webservice的文件),然后mock it!~~~
1. 向 spec/support 中增加 一个mock object: mock_device_resource.rb ,(它所模拟的就是 device_resource.rb )
原则上它的接口跟 original object是一样的,不过由于我的程序有点儿复杂,所以我为它们增加了一个新参数: options. 例如:
原始的对象:
# original object
class DeviceResource < BaseResource
def initialize(cloudset)
end
def find(params)
...
end
end
模拟的对象:
# mock objects
# to inherite the Constants from ServerSettingResource
class MockServerSettingResource < ServerSettingResource
# do nothing, just compatible with the interface
def initialize(cloudset)
end
# +options+
# * :failed : if set to true, will return []. default is false
# * :blank_result : alias to : failed option
def find(params, options = {})
return [] if options[:failed] || options[:blank_result]
return [result_hash.merge(params)]
end
end
2. 建立这个mock object 的 rspec 文件, 把 原来的 device_resource_spec中的所有test case, 都COPY过去。
3. 运行测试,增加实现。。。直到 mock_device_resource_rspec.rb 的测试全部通过。
至此,mock_device_resource.rb 已经通过TDD的方式实现好了。在我这里看到的改善是(消耗的时间):
testcase1: 45 s =>0.x
testcase2: 15s => 0.x
testcase3: 51.4 => 0.x
testcase4: 25 =>0.0x
时间被大大缩短,原来需要 200秒的测试,现在 0.45s . 爽歪歪了。
4. 那么,那些调用真实存在的webservice 的test case,对象,改如何处理呢? 对于 original object, 进行一些预处理:加上一个调用时的参数,来跳过这个 spec 文件:
describe DeviceResource do
next if ENV['with_real_webservice'] != "true"
before do
#...
end
end
然后,调用的时候:
4.1 跳过该文件: $ bundle exec rspec spec
4.2 执行该文件: $ with_real_webservice=true bundle exec rspec spec
5. 事情还没完,接下来,我们要找出所有origin object被调用的地方,使用 mock object “尽量(因为还是有一些test case很难替换,或者这些test case测试的就是的 web service,所以,能替换多少就多少吧)”替换这些 original object.
6. 最后,修改spec_helper.rb,使用所有的 mock object屏蔽掉它们的original object.
# 因为 类名 实际上就是 Constants
if ENV['with_real_webservice'] != "true"
DeviceResource = MockDeviceResource
DifsSettingResource = MockDifsSettingResource
ServerSettingResource = MockServerSettingResource
end
分享到:
相关推荐
Web服务(WebService)是一种基于互联网的、平台独立的交互方式,允许不同的系统之间进行数据交换和功能调用。在本项目中,通过运行名为"webservicTest"的主程序,我们可以对WebService进行测试。这个压缩包包含了三...
Web Service是一种通过互联网交换业务逻辑的软件系统,通常使用SOAP(Simple Object Access Protocol)协议进行通信,并且基于WSDL(Web Services Description Language)定义其接口。在Java开发环境中,常常利用API...
本文详细介绍了如何使用SOAPUI工具对SAP Webservice进行测试的过程,包括新建项目、配置测试用例、执行测试及结果分析等步骤,并给出了高级测试技巧的建议。希望本文能帮助读者更好地理解和掌握SAP Webservice的测试...
总的来说,C# WebService调用测试工具是一个强大的开发辅助工具,它帮助开发者在C#环境中测试和优化Web Service接口,支持多种数据交换格式,确保了跨平台和跨系统的互操作性。通过这样的工具,开发人员能够快速有效...
LoadRunner由Micro Focus公司开发,它通过模拟大量用户并发执行业务流程,来测试系统在高负载下的性能和稳定性。在Webservice场景下,LoadRunner能够模拟调用HTTP/HTTPS协议的Web服务,评估其处理能力和服务质量。 ...
总的来说,WebserviceStudio20是一个强大的Web服务测试工具,它简化了Web服务的测试流程,帮助开发者高效地验证服务功能,确保系统的稳定性和可靠性。无论是对于开发人员还是测试工程师,它都是一个不可或缺的工具。...
WebService是基于XML(Extensible Markup Language)的网络服务标准,它允许不同的系统通过互联网进行通信和交换数据。SOAP(Simple Object Access Protocol)是用于在Web上进行消息交换的一种协议,它是WebService...
Web服务接口测试是软件开发过程中不可或缺的一环,特别是在企业级应用和服务化架构中,Webservice作为数据交换的重要手段,其正确性和性能直接影响系统的稳定运行。本文将深入探讨如何利用C#来实现Webservice的测试...
WebService测试小工具是一款专为开发者和测试人员设计的实用软件,用于验证和调试WebService接口。在Web服务开发中,WebService是一种基于XML(Extensible Markup Language)的通信协议,它允许不同系统之间的数据...
在codefans.net这个网站上,可能会有相关的源码、教程或者论坛讨论,你可以查找有关WebService编写、调用和测试的相关资料,进一步学习和实践。 总结,WebService作为跨平台的通信手段,其编写、调用和测试是IT开发...
6. **使用方法**:使用Storm进行测试通常涉及配置测试环境,设置接口的URL、请求参数、期望的响应等信息,然后运行测试并分析结果。对于复杂的测试场景,可能还需要编写测试脚本,实现自动化测试。 7. **最佳实践**...
在实际应用中,使用WebserviceStudio20这样的测试工具,开发者可以高效地测试Web服务的正确性、稳定性和性能,确保在上线前达到预期标准。同时,它也是团队协作中,开发者与测试人员之间进行沟通和验证的有效手段,...
7. **自动化测试**:为了提高效率和减少人为错误,通常会将接口测试自动化,例如使用JUnit、TestNG等框架结合Mock服务器进行集成测试。 8. **持续集成**:将接口测试集成到持续集成/持续部署(CI/CD)流程中,每次...
标题中的“Postman在线测试webservice服务”是指使用Postman工具对Web Service接口进行功能验证和性能测试的过程。Postman是一款强大的API开发、测试和文档工具,尤其适用于RESTful服务,但同样可以用来测试传统的...
在本例中,“webservice的一个测试例子”是一个用于学习和日后参考的实例,它可能包含了创建和调用Web服务的基本步骤。 首先,让我们深入了解一下Web服务的工作原理。Web服务通过使用XML来描述数据,这样任何能够...
Web服务(WebService)是一种基于互联网的、...总的来说,Web服务接口测试是一项重要的质量保证活动,通过使用专业的测试工具,我们可以有效地确保WebService的质量、性能和安全性,为系统间的协同工作提供可靠的保障。
WebService Mock是用于模拟WebServices的非常简单但功能强大的工具。 为什么要使用WebService模拟? 通过非侵入性方式实现模拟,甚至无需编写任何代码行,这意味着无需模拟服务存根。 可以用于对应用程序进行压力...
Web服务(WebService)是一种基于互联网的、平台独立的交互方式,它允许不同系统之间的应用程序进行通信。WebService通常采用XML(可扩展标记语言)作为数据交换格式,并通过SOAP(简单对象访问协议)在HTTP协议上...
它允许不同的系统之间进行互操作,无论它们是运行在何种操作系统或者使用何种编程语言。Web服务通常通过SOAP(简单对象访问协议)在HTTP协议上进行通信,而WSDL(Web Services Description Language)则是用来描述...