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

来源:互联网 发布:苹果限免软件 编辑:程序博客网 时间:2024/05/17 23:23

  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-8import loggingimport tornado.ioloopimport tornado.webdef 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_dicclass 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写到配置文件里面,让测试人员更大的自由度。

1 0