之前的一篇博文提到过利用打算利用python写个mock系统以方便测试,主要是因为所测系统A依赖于其他系统的输入,两个系统属于不同的项目且开发和测试成员都不同,单独针对A系统进行测试时由于A的依赖性导致很多测试点无法覆盖且由于分属不同项目联调成本也较高,于是乎想到通过Mock的方式规避此问题,由于小弟之前只会java,所以第一时间想到的是用java编写一个mock系统,但是被测系统是C++实现的,那么就涉及到网络字节序的转换问题,研究了半天后开写,接收到的请求死活不能正确解析出来,而且发现代码还写了不少,头大,旁边同事在研究python,在他的强烈推荐下我就考虑怎么用python去实现,利用业余时间突击学习了一个月的python,终于大功告成,下面记录一下我的学习历程和收获!

1.迅速翻阅《python核心编程》第一部分,以及第二部分的“网络编程”章节(因为涉及两个系统的通信),由于有java的经验上手还是比较快的。

2.根据书中内容用python编写个简单的Socket服务端,能接收到被测系统的请求;这时谷歌上搜到python已经有SocketServer模块,只要引入它及它的子类StreamRequestHandler并重写handler方法(具体请求处理)。于是接下来考虑handler方法的具体实现,主要分两部分:1.请求的接收2.请求结果的返回;第一部分查看python官方文档轻松实现,第二部分先根据两个系统间的请求和反馈格式拼装内容,拼装完后考虑到python没有Byte类型,如何将拼装的内容转化为字节流并且让C++实现的系统能够识别呢?网上搜了搜,发现有struct这个好东西!利用它的pack方法可以将内容转换成指定的格式,pack方法有两个参数,一是转换后的格式定义,二是待转换的内容,下面贴上格式定义符与C++和python中的对应关系:

> 格式c类型python类型> xchar无(表示填充字节)
> cchar长度为1的字符串
> bsigned charinteger
> Bunsigned charinteger
> hshortinteger
> Hunsigned shortinteger
> iintinteger
> Iunsigned intlong
> llonginteger
> Lunsigned longlong
> qlong longlong
> Qunsigned long longlong
> ffloatfloat
> ddoublefloat
> schar[]string
> pchar[]string
> Pvoid*integer
> 字符字节顺序长度和对齐方式> @nativenative
> =nativestandard
> 
> >big-endianstandard
> !network (= big-endian)standard