monkeysocks开发日志--动机

monkeysocks的目标是为开发以及测试提供一个稳定的环境。

前几天听说公司的测试团队在鼓捣数据固化的东西,说白了就是在测试启动时构建一个临时性的数据库,操作完之后再销毁,这样的好处是不造成测试副作用,同时屏蔽环境的差异。

但是目前公司内部SOA用的太多了,仅仅靠数据库固化明显不现实,公司的架构团队做了一个将所有remote service放到本地启动的东西,但是这样子启动开销有点难以接受。有没有更可行的方案?

之前也有人做过一个单测的东西,可以将所有RPC调用的结果序列化成文本文件,下次调用时再序列化出来,这样其实就屏蔽了远程调用。但是Java语言层面的机制导致要把千奇八怪的对象序列化下来,本来就是不可完成的任务(有些对象本身就不是POJO,还有在getter、setter写逻辑的)。

于是我有一个大胆的设想:其实Java的外部依赖无非是网络IO,就是TCP/UDP包嘛,那我能不能做一个工具,录制一个稳定环境的网络流量,然后固化下来,最终在调用时进行重放,岂不是一劳永逸?

但是TCP/UDP毕竟是系统底层的东西,而且我想对每个Java进程单独做重放,所以只能从Java内部机制入手了。

有两个方法:

用cglib改写所有网络IO相关的接口,改用固化调用。

设置Java全局socks代理,并启动socks server,在socks server里做代理。

显然第二种方法更简单,有四两拨千斤的感觉!

找到一个Java socks server,jsocks,最初版本比较老,google code上有一个改进版,用的是ant,因为以后要集成肯定要用maven,于是就做了点maven化的处理,考虑以后单独做成一个项目,现在先改了测试下可行性吧。https://github.com/code4craft/jsocks

Java里面设置全局socksProxy的方法见http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html。

鼓捣一下,成功启动起来,明天先对公司的项目进行试用。

你可能感兴趣的:(java,test,socks)