python自动化测试框架结构_Python+requests+unittest+excel实现接口自动化测试框架

原标题:Python+requests+unittest+excel实现接口自动化测试框架

一、框架结构:

6d2312e699b44750bbec30af39088fd8.jpeg

工程目录

99dc7207ab2543d999cf17e39c4cb38b.jpeg

二、Case文件设计

7a160b10f62a4e9da7a03546466dd2df.jpeg

三、基础包 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&notify_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

c6b056fcc8a54d78a29d720879759e8e.gif

*本文来源网络,如有侵权,请联系删除。

链接:https://dwz.cn/4Y7d1mzo

RECOMMEND

我就知道你“在看”

责任编辑:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值