原标题:Python+requests+unittest+excel实现接口自动化测试框架
一、框架结构:
工程目录
二、Case文件设计
三、基础包 base
3.1 封装get/post请求(runmethon.py)
1importrequests
2importjson
3classRunMethod:
4defpost_main(self,url,data,header=None):
5res =None
6ifheader !=None:
7res = requests.post(url=url,data=data,headers=header)
8else:
9res = requests.post(url=url,data=data)
10returnres.json
11
12defget_main(self,url,data=None,header=None):
13res =None
14ifheader !=None:
15res = requests.get(url=url,data=data,headers=header,verify=False)
16else:
17res = requests.get(url=url,data=data,verify=False)
18returnres.json
19
20defrun_main(self,method,url,data=None,header=None):
21res =None
22ifmethod == 'Post':
23res =self.post_main(url,data,header)
24else:
25res =self.get_main(url,data,header)
26returnjson.dumps(res,ensure_ascii=False,sort_keys=True,indent=2)
3.2 封装mock(mock.py)
1frommock importmock
2#模拟mock 封装
3defmock_test(mock_method,request_data,url,method,response_data):
4mock_method = mock.Mock(return_value=response_data)
5res =mock_method(url,method,request_data)
6returnres
四、数据操作包 operation_data
4.1 获取excel单元格中的内容(get_data.py)
1#coding:utf-8
2fromtool.operation_excel importOperationExcel
3importdata_config
4fromtool.operation_json importOperetionJson
5fromtool.connect_db importOperationMysql
6classGetData:
7def__init__(self):
8self.opera_excel =OperationExcel
9
10#去获取excel行数,就是case的个数
11defget_case_lines(self):
12returnself.opera_excel.get_lines
13
14#获取是否执行
15defget_is_run(self,row):
16flag =None
17col =int(data_config.get_run)
18run_model =self.opera_excel.get_cell_value(row,col)
19ifrun_model == 'yes':
20flag =True
21else:
22flag =False
23returnflag
24
25#是否携带header
26defis_header(self,row):
27col =int(data_config.get_header)
28header =self.opera_excel.get_cell_value(row,col)
29ifheader != '':
30returnheader
31else:
32returnNone
33
34#获取请求方式
35defget_request_method(self,row):
36col =int(data_config.get_run_way)
37request_method =self.opera_excel.get_cell_value(row,col)
38returnrequest_method
39
40#获取url
41defget_request_url(self,row):
42col =int(data_config.get_url)
43url =self.opera_excel.get_cell_value(row,col)
44returnurl
45
46#获取请求数据
47defget_request_data(self,row):
48col =int(data_config.get_data)
49data =self.opera_excel.get_cell_value(row,col)
50ifdata == '':
51returnNone
52returndata
53
54#通过获取关键字拿到data数据
55defget_data_for_json(self,row):
56opera_json =OperetionJson
57request_data =opera_json.get_data(self.get_request_data(row))
58returnrequest_data
59
60#获取预期结果
61defget_expcet_data(self,row):
62col =int(data_config.get_expect)
63expect =self.opera_excel.get_cell_value(row,col)
64ifexpect == '':
65returnNone
66returnexpect
67
68#通过sql获取预期结果
69defget_expcet_data_for_mysql(self,row):
70op_mysql =OperationMysql
71sql =self.get_expcet_data(row)
72res =op_mysql.search_one(sql)
73returnres.decode('unicode-escape')
74
75defwrite_result(self,row,value):
76col =int(data_config.get_result)
77self.opera_excel.write_value(row,col,value)
78
79#获取依赖数据的key
80defget_depend_key(self,row):
81col =int(data_config.get_data_depend)
82depent_key =self.opera_excel.get_cell_value(row,col)
83ifdepent_key == "":
84returnNone
85else:
86returndepent_key
87
88#判断是否有case依赖
89defis_depend(self,row):
90col =int(data_config.get_case_depend)
91depend_case_id =self.opera_excel.get_cell_value(row,col)
92ifdepend_case_id == "":
93returnNone
94else:
95returndepend_case_id
96
97#获取数据依赖字段
98defget_depend_field(self,row):
99col =int(data_config.get_field_depend)
100data =self.opera_excel.get_cell_value(row,col)
101ifdata == "":
102returnNone
103else:
104returndata
4.2 获取excel中每个列(data_config.py)
1#coding:utf-8
2classglobal_var:
3#case_id
4Id = '0'
5request_name = '1'
6url = '2'
7run = '3'
8request_way = '4'
9header = '5'
10case_depend = '6'
11data_depend = '7'
12field_depend = '8'
13data = '9'
14expect = '10'
15result = '11'
16#获取caseid
17defget_id:
18returnglobal_var.Id
19
20#获取url
21defget_url:
22returnglobal_var.url
23
24defget_run:
25returnglobal_var.run
26
27defget_run_way:
28returnglobal_var.request_way
29
30defget_header:
31returnglobal_var.header
32
33defget_case_depend:
34returnglobal_var.case_depend
35
36defget_data_depend:
37returnglobal_var.data_depend
38
39defget_field_depend:
40returnglobal_var.field_depend
41
42defget_data:
43returnglobal_var.data
44
45defget_expect:
46returnglobal_var.expect
47
48defget_result:
49returnglobal_var.result
50
51defget_header_value:
52returnglobal_var.header
4.3 解决数据依赖(dependent.py )
1#coding:utf-8
2importsys
3importjson
4sys.path.append('C:/Users/lxz/Desktop/InterFace_JIA')
5fromtool.operation_excel importOperationExcel
6frombase.runmethod importRunMethod
7fromoperation_data.get_data importGetData
8fromjsonpath_rw importjsonpath,parse
9classDependdentData:
10def__init__(self,case_id):
11self.case_id =case_id
12self.opera_excel =OperationExcel
13self.data =GetData
14
15#通过case_id去获取该case_id的整行数据
16defget_case_line_data(self):
17rows_data =self.opera_excel.get_rows_data(self.case_id)
18returnrows_data
19
20#执行依赖测试,获取结果
21defrun_dependent(self):
22run_method =RunMethod
23row_num =self.opera_excel.get_row_num(self.case_id)
24request_data =self.data.get_data_for_json(row_num)
25#header = self.data.is_header(row_num)
26method =self.data.get_request_method(row_num)
27url =self.data.get_request_url(row_num)
28res =run_method.run_main(method,url,request_data)
29returnjson.loads(res)
30
31#根据依赖的key去获取执行依赖测试case的响应,然后返回
32defget_data_for_key(self,row):
33depend_data =self.data.get_depend_key(row)
34response_data =self.run_dependent
35json_exe =parse(depend_data)
36madle =json_exe.find(response_data)
37return[math.value formath inmadle][0]
38
39if__name__== '__main__':
40order ={
41"data": {
42"_input_charset": "utf-8",
43"body": "京东订单-1710141907182334",
44"it_b_pay": "1d",
45"notify_url": "http://order.imooc.com/pay/notifyalipay",
46"out_trade_no": "1710141907182334",
47"partner": "2088002966755334",
48"payment_type": "1",
49"seller_id": "yangyan01@tcl.com",
50"service": "mobile.securitypay.pay",
51"sign": "kZBV53KuiUf5HIrVLBCcBpWDg%2FnzO%2BtyEnBqgVYwwBtDU66Xk8VQUTbVOqDjrNymCupkVhlI%2BkFZq1jOr8C554KsZ7Gk7orC9dDbQl
pr%2BaMmdjO30JBgjqjj4mmM%2Flphy9Xwr0Xrv46uSkDKdlQqLDdGAOP7YwOM2dSLyUQX%2Bo4%3D",
52"sign_type": "RSA",
53"string": "_input_charset=utf-8&body=京东订单-1710141907182334&it_b_pay=1d¬ify_url=http://order.imooc.com/pay/
notifyalipay&out_trade_no=1710141907182334&partner=2088002966755334&payment_type=1&seller_id=yangyan01@
tcl.com&service=mobile.securitypay.pay&subject=京东订单-1710141907182334&total_fee=299&sign=kZBV53KuiUf5H
IrVLBCcBpWDg%2FnzO%2BtyEnBqgVYwwBtDU66Xk8VQUTbVOqDjrNymCupkVhlI%2BkFZq1jOr8C554KsZ7Gk7orC9dDbQlpr%2BaMmdjO30
JBgjqjj4mmM%2Flphy9Xwr0Xrv46uSkDKdlQqLDdGAOP7YwOM2dSLyUQX%2Bo4%3D&sign_type=RSA",
54"subject": "京东订单-1710141907182334",
55"total_fee": 299
56},
57"errorCode": 1000,
58"errorDesc": "成功",
59"status": 1,
60"timestamp": 1507979239100
61}
62res = "data.out_trade_no"
63json_exe =parse(res)
64madle =json_exe.find(order)
65print[math.value formath inmadle][0]
五、工具类包 tool
5.1 操作excel (operation_excel.py)
1#coding:utf-8
2importxlrd
3fromxlutils.copy importcopy
4classOperationExcel:
5def__init__(self,file_name=None,sheet_id=None):
6iffile_name:
7self.file_name =file_name
8self.sheet_id =sheet_id
9else:
10self.file_name = '../dataconfig/case1.xls'
11self.sheet_id =0
12self.data =self.get_data
13
14#获取sheets的内容
15defget_data(self):
16data =xlrd.open_workbook(self.file_name)
17tables =data.sheets[self.sheet_id]
18returntables
19
20#获取单元格的行数
21defget_lines(self):
22tables =self.data
23returntables.nrows
24
25#获取某一个单元格的内容
26defget_cell_value(self,row,col):
27returnself.data.cell_value(row,col)
28
29#写入数据
30defwrite_value(self,row,col,value):
31'''
32写入excel数据
33row,col,value
34'''
35read_data =xlrd.open_workbook(self.file_name)
36write_data =copy(read_data)
37sheet_data =write_data.get_sheet(0)
38sheet_data.write(row,col,value)
39write_data.save(self.file_name)
40
41#根据对应的caseid 找到对应行的内容
42defget_rows_data(self,case_id):
43row_num =self.get_row_num(case_id)
44rows_data =self.get_row_values(row_num)
45returnrows_data
46
47#根据对应的caseid找到对应的行号
48defget_row_num(self,case_id):
49num =0
50clols_data =self.get_cols_data
51forcol_data inclols_data:
52ifcase_id incol_data:
53returnnum
54num = num+1
55
56
57#根据行号,找到该行的内容
58defget_row_values(self,row):
59tables =self.data
60row_data =tables.row_values(row)
61returnrow_data
62
63#获取某一列的内容
64defget_cols_data(self,col_id=None):
65ifcol_id !=None:
66cols =self.data.col_values(col_id)
67else:
68cols =self.data.col_values(0)
69returncols
70
71
72if__name__== '__main__':
73opers =OperationExcel
74printopers.get_cell_value(1,2)
5.2判断字符串包含,判断字典是否相等(common_util.py)
1#coding:utf-8
2importjson
3classCommonUtil:
4defis_contain(self,str_one,str_two):
5'''
6判断一个字符串是否再另外一个字符串中
7str_one:查找的字符串
8str_two:被查找的字符串
9'''
10flag =None
11ifisinstance(str_one,unicode):
12str_one = str_one.encode('unicode-escape').decode('string_escape')
13returncmp(str_one,str_two)
14ifstr_one instr_two:
15flag =True
16else:
17flag =False
18returnflag
19
20
21defis_equal_dict(self,dict_one,dict_two):
22'''
23判断两个字典是否相等
24'''
25ifisinstance(dict_one,str):
26dict_one =json.loads(dict_one)
27ifisinstance(dict_two,str):
28dict_two =json.loads(dict_two)
29returncmp(dict_one,dict_two)
5.3 操作header(operation_herder.py)
1#coding:utf-8
2importrequests
3importjson
4fromoperation_json importOperetionJson
5
6
7classOperationHeader:
8
9def__init__(self,response):
10self.response =json.loads(response)
11
12defget_response_url(self):
13'''
14获取登录返回的token的url
15'''
16url = self.response['data']['url'][0]
17returnurl
18
19defget_cookie(self):
20'''
21获取cookie的jar文件
22'''
23url = self.get_response_url+"&callback=jQuery21008240514814031887_1508666806688&_=1508666806689"
24cookie =requests.get(url).cookies
25returncookie
26
27defwrite_cookie(self):
28cookie =requests.utils.dict_from_cookiejar(self.get_cookie)
29op_json =OperetionJson
30op_json.write_data(cookie)
31
32if__name__== '__main__':
33
34url = "http://www.jd.com/passport/user/login"
35data ={
36"username":"18513199586",
37"password":"111111",
38"verify":"",
39"referer":"https://www.jd.com"
40}
41res =json.dumps(requests.post(url,data).json)
42op_header =OperationHeader(res)
43op_header.write_cookie
5.4 操作json文件(operation_json.py)
1#coding:utf-8
2importjson
3classOperetionJson:
4
5def__init__(self,file_path=None):
6iffile_path ==None:
7self.file_path = '../dataconfig/user.json'
8else:
9self.file_path =file_path
10self.data =self.read_data
11
12#读取json文件
13defread_data(self):
14with open(self.file_path) as fp:
15data =json.load(fp)
16returndata
17
18#根据关键字获取数据
19defget_data(self,id):
20printtype(self.data)
21returnself.data[id]
22
23#写json
24defwrite_data(self,data):
25with open('../dataconfig/cookie.json','w') as fp:
26fp.write(json.dumps(data))
27
28
29
30if__name__== '__main__':
31opjson =OperetionJson
32printopjson.get_data('shop')
5.5 操作数据库(connect_db.py)
1#coding:utf-8
2importMySQLdb.cursors
3importjson
4classOperationMysql:
5def__init__(self):
6self.conn =MySQLdb.connect(
7host='localhost',
8port=3306,
9user='root',
10passwd='123456',
11db='le_study',
12charset='utf8',
13cursorclass=MySQLdb.cursors.DictCursor
14)
15self.cur =self.conn.cursor
16
17#查询一条数据
18defsearch_one(self,sql):
19self.cur.execute(sql)
20result =self.cur.fetchone
21result =json.dumps(result)
22returnresult
23
24if__name__== '__main__':
25op_mysql =OperationMysql
26res = op_mysql.search_one("select * from web_user where Name='ailiailan'")
27printres
5.6 发送报告邮件(send_email.py)
1#coding:utf-8
2importsmtplib
3fromemail.mime.text importMIMEText
4classSendEmail:
5globalsend_user
6globalemail_host
7globalpassword
8email_host = "smtp.163.com"
9send_user = "jiaxiaonan666@163.com"
10password = "jia_668"
11defsend_mail(self,user_list,sub,content):
12user = "jiaxiaonan"+"<"+send_user+">"
13message = MIMEText(content,_subtype='plain',_charset='utf-8')
14message['Subject'] =sub
15message['From'] =user
16message['To'] = ";".join(user_list)
17server =smtplib.SMTP
18server.connect(email_host)
19server.login(send_user,password)
20server.sendmail(user,user_list,message.as_string)
21server.close
22
23defsend_main(self,pass_list,fail_list):
24pass_num =float(len(pass_list))
25fail_num =float(len(fail_list))
26count_num = pass_num+fail_num
27#90%
28pass_result = "%.2f%%"%(pass_num/count_num*100)
29fail_result = "%.2f%%"%(fail_num/count_num*100)
30
31
32user_list = ['609037724@qq.com']
33sub = "接口自动化测试报告"
34content = "此次一共运行接口个数为%s个,通过个数为%s个,失败个数为%s,通过率为%s,失败率为%s"%(count_num,pass_num,fail_num,pass_result,fail_result )
35self.send_mail(user_list,sub,content)
36
37if__name__== '__main__':
38sen =SendEmail
39sen.send_main([1,2,3,4],[2,3,4,5,6,7])
六、主函数
run_test.py
1#coding:utf-8
2importsys
3sys.path.append("C:/Users/lxz/Desktop/InterFace_JIA")
4frombase.runmethod importRunMethod
5fromoperation_data.get_data importGetData
6fromtool.common_util importCommonUtil
7fromoperation_data.dependent_data importDependdentData
8fromtool.send_email importSendEmail
9fromtool.operation_header importOperationHeader
10fromtool.operation_json importOperetionJson
11classRunTest:
12def__init__(self):
13self.run_method =RunMethod
14self.data =GetData
15self.com_util =CommonUtil
16self.send_mai =SendEmail
17
18#程序执行的
19defgo_on_run(self):
20res =None
21pass_count =[]
22fail_count =[]
23#10 0,1,2,3
24rows_count =self.data.get_case_lines
25fori inrange(1,rows_count):
26is_run =self.data.get_is_run(i)
27ifis_run:
28url =self.data.get_request_url(i)
29method =self.data.get_request_method(i)
30request_data =self.data.get_data_for_json(i)
31expect =self.data.get_expcet_data_for_mysql(i)
32header =self.data.is_header(i)
33depend_case =self.data.is_depend(i)
34ifdepend_case !=None:
35self.depend_data =DependdentData(depend_case)
36#获取的依赖响应数据
37depend_response_data =self.depend_data.get_data_for_key(i)
38#获取依赖的key
39depend_key =self.data.get_depend_field(i)
40request_data[depend_key] =depend_response_data
41ifheader == 'write':
42res =self.run_method.run_main(method,url,request_data)
43op_header =OperationHeader(res)
44op_header.write_cookie
45
46elifheader == 'yes':
47op_json = OperetionJson('../dataconfig/cookie.json')
48cookie = op_json.get_data('apsid')
49cookies ={
50'apsid':cookie
51}
52res =self.run_method.run_main(method,url,request_data,cookies)
53else:
54res =self.run_method.run_main(method,url,request_data)
55
56ifself.com_util.is_equal_dict(expect,res) ==0:
57self.data.write_result(i,'pass')
58pass_count.append(i)
59else:
60self.data.write_result(i,res)
61fail_count.append(i)
62self.send_mai.send_main(pass_count,fail_count)
63
64#将执行判断封装
65#def get_cookie_run(self,header):
66
67
68if__name__== '__main__':
69run =RunTest
70run.go_on_run
*本文来源网络,如有侵权,请联系删除。
链接:https://dwz.cn/4Y7d1mzo
RECOMMEND
我就知道你“在看”
责任编辑: