MockServer的技术实现
目前,笔者已经用Python实现了一个基于socket接口的Mock Server并在测试中进行了一定的应用,实现中利用了一些Python的语言特性、一点RPC技术和一点DSL的技巧。
一个CASE
下面先看一个实际的CASE,CASE加入了许额外的注释,以解释这段代码的意义(CASE的格式为一种可嵌入Python代码的DSL脚本)
#定义用例集 CASE DS返回结果异常测试 BEGIN #定义用例的公共数据,后面的用例中都可以引用该数据,且互不干扰 GROUP_ID=55 #定义用例的公共入口动作,相关CASE的MAIN函数 __exec__=BEGIN PYTHON mock_execute(r"""${MOCK_DATA}""".strip()) #设置MockServer的行为 PYTHON request(host='${HOST}',port=${PORT},id=${MEDIA_ID},group=${GROUP_ID},time=${TIME},type='${TYPE}',cached=${CACHED},cache_flag='${CACHE_FLAG}') #向被测模块发送一条请求 END #定义用例 CASE 测试 1 BEGIN #定义用例数据,描述MockServer的行为 MOCK_DATA=BEGIN Mock.on( large_than(192), #当接收的数据长度大于192字节时(一个正常请求的最小长度) ).do( send_back( #返回下面的数据包 am_head_t(1,0,(c_uint32*2)(100,100),sizeof(ds_qres_head_t)+12+32), ds_qres_head_t(0,1,1,32,12,), 2,4, "show", 47,3,4,12, 123,"hello,world!" ), clear_buf(), #清除接收缓冲区 clear_mock(), #请除MockServer的行为 ) END END #定义用例 CASE 测试 2 BEGIN …… …… END …… …… …… …… END |
上面的代码中,request的函数的功能是将各参数拼装成一个HTTP请求发送给被测系统并接收返回的结果。而mock_execute也就是对 Mock Server的调用了。
下面就看看这个Mock Server是如让上面的CASE得以运行的
核心代码
首先看Mock Server中的主体代码,该代码基于Python中的ThreadingTCPServer,如下:
while not self.stop and not self.server.stop: buf=self.sock.recv(4096) if not buf: time.sleep(0.1) self.buffer+=buf for mock in MockRequestHandler.mocks: if mock(self): break |