用python做自动化测试--对服务器端的自动化测试(4)-接收端Http Server模拟器

时间:2022-09-16 05:55:58

  Python有很多成熟的web框架,比如大名鼎鼎的Django和Pylons, 不过用这些来开发HTTP server模拟器,有点杀鸡用牛刀的意思,也比较复杂,所以web.py, Tornada是最好的选择,2者的用法基本类似。 我开始用的是web.py, 但web,py对于transfer-encoding: chunked的支持不好,当body很大的时候,会导致内存快速增加,溢出,需要打补丁才可以解决。 在搜索这个问题的解决方案的时候,看到了tornado, 性能是web.py的几十倍,用法是基本完全一样的,所以果断换成了Tornado。


#!/usr/bin/env python
#coding=utf-8

import logging
import tornado.ioloop
import tornado.web

def get_headers(headers_value_file):
headers_value_dic={}
head_file=open(headers_value_file,"r")
lines=head_file.readlines()
head_file.close()
for line in lines:
if (line.split(":")[0]).strip()[0]!="#":
headers_value_dic[(line.split(":")[0]).strip()]=(line.split(":")[1]).strip()
return headers_value_dic


class register(tornado.web.RequestHandler):

def get(self):
self.write("registration is ok")

def post(self):
#得到全部的body数据,可以解析body的输入,构造reponse,这块涉及到公司业务,所以删除了,
request_stream = self.request.body
logging.debug("request:"+request_stream)
#设置response header, 要设置哪些header和对应值,在register.header配置文件里面
for header, value in get_headers("register.header").iteritems():
self.set_header(header, value)
rep=open("register.response","r")
response=rep.read().strip()
rep.close()
self.write(self.write(response))

class SMSVerification(tornado.web.RequestHandler):

def get(self):
self.write("SMSVerification is ok")

def post(self):
request_stream = self.request.body
logging.debug("request:"+request_stream)
response='''<?xml version="1.0" encoding="UTF-8"?>
< SMSVerificationResponse >
<ResponseCode>0</ResponseCode>
<UserName>testuser</UserName>
<UserPassword>12345</UserPassword>
</ SMSVerificationResponse >'''

self.write(response)

if __name__=='__main__':
application = tornado.web.Application([
(r"/register", register),
(r"/SMSVerification", SMSVerification),
])
logging.basicConfig(filename="simserver.log",level=0,format='%(asctime)s %(name)s %(levelname)s %(module)s:%(lineno)d %(message)s')

application.listen(8888)
tornado.ioloop.IOLoop.instance().start()


这里的register对应前面client模拟器的reg响应, 返回给client的HTTP response。

 

register.header  文件例子

Content-Type: text/plain
Date:Mon, 04 Aug 2014 14:33:54 GMT
Connection:keep-alive
Vary:Accept-Encoding


register.response 文件例子

<?xml version="1.0" encoding="UTF-8"?>
< UserRegisterResponse >
<ResponseCode>0</ResponseCode>
<Description> Authentication success </Description>
   </ UserRegisterResponse >


如果想要得到URL的参数,可以通过self.get_query_argument("username")

如果想要得到body里面的的参数,可以通过self.get_body_argument("username")


上面的例子比Django的web application简单多了吧,tornado web服务是非阻塞的异步模式,性能很好,用来开发高性能的模拟器也是非常适用的。
关于模拟器,还想多说一点,很多时候测试开发的时间很短,测试开发人员又少,模拟器可以简单化,不解析HTTP Client端输入,直接把response写到配置文件里面,让测试人员更大的*度。