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

  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写到配置文件里面,让测试人员更大的自由度。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值