python的http client库很多,有httplib, urllib 和urllib2,但这几个用起来还是比较麻烦,requests 是高富帅(http://docs.python-requests.org/en/latest/),接口更简洁,优雅。 支持Json, 很方便设置发送的header, session管理。
发送端模拟器要实现的功能是:不同的消息,需要post不同的参数过去,服务器端对已header不做检测,所以这里也就没有设置任何header的参数。默认的就好。
#!/usr/bin/env python
#coding=utf-8
import time,logging,sys,os
import pickle
import uuid
import requests
import ConfigParser
class RequestClient:
def __init__(self,client_cfg,mms_cfg_dir):
#http://127.0.0.1:8080/mm7process
self.client_cfg=client_cfg
self.url=self.client_cfg.get("sysparm","peer_ip")+":"+\
self.client_cfg.get("sysparm","peer_port")+"/"
self.mms_cfg_dir=mms_cfg_dir
def get_path_data(self,fi,wifi_para):
fi=open(fi,"r")
lines=fi.readlines()
fi.close()
path=lines[0].strip().split(":")[1]
data=lines[1].strip().split(":")[1]
#这里是替换模板中的两个变量
for k, v in wifi_para.iteritems():
origi_data=origi_data.replace("{%"+k+"%}",v)
logging.debug("path:"+path)
logging.debug("post original data:"+origi_data)
return path, data
def wifi_client(self,send_msg_type,msg_id=None,wifi_kw={}):
if send_msg_type=="reg":
session = requests.session()
conf_file=os.path.join(self.mms_cfg_dir,"registration.cfg")
response=requests.post(self.url+"registration", data=self.get_path_data(conf_file,wifi_kw)[1])
#print response.cookies
#保存cookie为下面的消息流程使用,当然这里其实可以和下面的消息合并,提高程序的运行效率,但为了同时支持功能测试,方便功能测试的使用,
#所以保存到文件了,对效率有一定牺牲
cookie_file=open('cookie', 'wb')
pickle.dump(response.cookies, cookie_file)
cookie_file.close()
elif send_msg_type=="smsv":
conf_file=os.path.join(self.mms_cfg_dir,"smsverification.cfg")
in_cookie_file=open('cookie', 'rb')
in_cookies = pickle.load(in_cookie_file)
in_cookie_file.close()
response=requests.post(self.url+self.get_path_data(conf_file,wifi_kw)[0], data=self.get_path_data(conf_file,wifi_kw)[1],cookies=in_cookies)
elif send_msg_type=="qba":
conf_file=os.path.join(self.mms_cfg_dir,"querybalance.cfg")
response=requests.post(self.url+self.get_path_data(conf_file,wifi_kw)[0], data=self.get_path_data(conf_file,wifi_kw)[1])
else:
logging.error("wrong command")
logging.debug("receive response:"+response.text)
def init_attri_config_file(file_name):
'''
Use ConfigParser to parse below configuration file:
[selection]:
option:value
'''
config = ConfigParser.ConfigParser()
try:
if os.path.exists(file_name):
config.read(file_name)
return config
except:
logging.error(file_name+" is not exit")
def wifi_client_simulator(MM7Client):
logging.debug("Start to do performace testing for wifi")
MSISDN=2341824988270
#complte message flow per second
rate=10
while 1:
try:
MSISDN=MSISDN+1
logging.info("start testing with MSISDN "+str(MSISDN))
wifi_parameter={}
wifi_parameter["SessionID"]=str(uuid.uuid1())
wifi_parameter["MSISDN"]=str(MSISDN)
#这里打印每个消息发送和完成的时间,目的是为了在性能测试中,分析系统性能瓶颈,用这种方式,可以很快定位到是被测试系统瓶颈
#还是模拟器瓶颈,或者是网络瓶颈。具体这块怎么分析,在后面专门做个性能测试分析的专题吧
logging.info("Start register for MSISDN "+str(MSISDN)+" at "+str(time.time()))
MM7Client.mm7_client("reg",wifi_kw=wifi_parameter)
logging.info("End register for MSISDN "+str(MSISDN)+" at "+str(time.time()))
smscode="1234"
wifi_parameter["SMSCode"]=smscode
logging.info("Start verification for MSISDN "+str(MSISDN)+" at "+str(time.time()))
MM7Client.mm7_client("smsv",wifi_kw=wifi_parameter)
logging.info("End verification for MSISDN "+str(MSISDN)+" at "+str(time.time()))
#这里的用户名,密码,还有上面的smscode其实是从数据库获得的,为了代码演示,这里直接赋值了
user_password=("test","testpasswd")
logging.debug("username and password"+str(user_password))
wifi_parameter["UserName"]=str(user_password[0])
wifi_parameter["UserPassword"]=str(user_password[1])
logging.info("Start qba for MSISDN "+str(MSISDN)+" at "+str(time.time()))
MM7Client.mm7_client("qba",wifi_kw=wifi_parameter)
logging.info("End qba for MSISDN "+str(MSISDN)+" at "+str(time.time()))
logging.info("Ended testing with MSISDN "+str(MSISDN))
time.sleep(1.0/rate)
except:
logging.exception("exception:")
if __name__=="__main__":
import sys
sys.setdefaultencoding('utf-8')
logging.basicConfig(filename="client.log",level=0,format='%(asctime)s %(name)s %(levelname)s %(module)s:%(lineno)d %(message)s')
mms_cfg_dir="D:\jobs\code\TestScript\SVN\wificlient\conf"
cfg=init_attri_config_file(os.path.join(mms_cfg_dir,"mmsc.cfg"))
Wifi_request_client=RequestClient(cfg,mms_cfg_dir)
wifi_client_simulator(Wifi_request_client)
配置文件例子,mmsc.cfg:
[sysparm]
#以下2个是gateway接受消息的地址。
peer_ip: http://192.168.53.20
peer_port: 8991
registration.cfg文件例子:
path:webauthv2/api/v1/user/register?ssid=6721&phase=1
data:SessionID={%SessionID%}&MessageType=1&MSISDN={%MSISDN%}&Platform=iOS&MACAddress=001122334455
在这里,我们需要保证每次生成的SessionID 和MSISDN不一样,所以每次需要利用此模板,替换这个2个值。
这样一个http client的模拟器就完成了,持续的给服务器发送消息。如果要高并发的,可以改成多线程或者多进程方式。