Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

python+unittest+requests+HTMLRunner编写接口自动化测试集

kristin_n 2019-02-16 15:40:00 阅读数:293 评论数:0 点赞数:0 收藏数:0

问题描述:搭建接口测试框架,执行用例请求多个不同请求方式的接口

 

实现步骤:

① 创建配置文件config.ini,写入部分公用参数,如接口的基本url、测试报告文件路径、测试数据文件路径等配置项1 [DATABASE]2 data_address = ./data/data.xlsx3 report_address = ./report/ 4 driver = ./drivers/chromedriver.exe5 6 [HTTP]7 base_url = https:///*/*/*./*/*/*.cn//

② 从配置文件中读取并返回文件中内容,或写入配置文件的方法,文件命名 readConfig.py

1 importos2 importconfigparser3 4 /#获取当前py文件地址 5 proDir = os.path.split(os.path.realpath(file))[0]6 /#组合config文件地址 7 configPath = os.path.join(proDir,"config.ini")8 9 classReadConfig:10 def __init__(self):11 /#获取当前路径下的配置文件 12 self.cf =configparser.ConfigParser()13 self.cf.read(configPath)14 15 defget_config(self,field,key):16 /#获取配置文件中的key值 17 result =self.cf.get(field,key)18 returnresult19 20 defset_config(self,field,key,value):21 /#向配置文件中写入配置信息 22 fb = open(configPath,'w')23 self.cf.set(field,key,value)24 self.cf.write(fb)

③ 从配置文件中获取到接口的基本url后,根据不同的接口请求方式读取请求体或其他参数信息,参数信息从excel中读取,因此文件readExcel.py用于读取并返回excel文件中内容,或写入Excel的方法

1 importxlrd2 importxlutils.copy3 from Base.readConfig importReadConfig4 importtime5 6 classReadExcel:7 8 def init(self,section,field,sheet):9 /#打开工作表,并定位到sheet 10 dataaddress =ReadConfig().getconfig(section,field)11 workbook =xlrd.openworkbook(dataaddress)12 self.table =workbook.sheets()[sheet]13 14 15 defget_rows(self):16 /#获取excel行数 17 rows =self.table.nrows18 returnrows19 20 defget_cell(self,row,col):21 /#获取单元格数据 22 cell_data =self.table.cell(row,col).value23 returncell_data24 25 defget_col(self,col):26 /#获取整列数据 27 col_data =self.table.col_value(col)28 returncol_data29 30 classWriteExcel:31 def __init__(self,section,field,sheet):32 /#打开工作表 33 self.address =ReadConfig().get_config(section,field)34 self.workbook =xlrd.open_workbook(self.address)35 self.wf =xlutils.copy.copy(self.workbook)36 self.ws =self.wf.get_sheet(sheet)37 38 defset_cell(self,row,col,value):39 /#设置单元格数据 40 self.ws.write(row,col,value)41 42 defsave_excel(self,filename,format):43 /#获取当前时间 44 self.time = time.strftime("%Y%m%d%H%M%S", time.localtime())45 /#生成文件的文件名及格式 46 self.report = filename + '_' +self.time +format47 /#保存文件 48 self.wf.save(self.report)

④ 将获取接口的url、请求头、参数等方法封装成类并写入base.py中,用于测试框架中测试集的直接调取

1 from Base.readConfig importReadConfig2 from Base.readExcel importReadExcel3 4 /#实例化 5 readexcel = ReadExcel('DATABASE','dataaddress',0)6 7 classBasePage(object):8 def init(self, seleniumdriver):9 self.driver =seleniumdriver10 11 defgetapi(self, row, col):12 /#获取url 13 self.baseurl = ReadConfig().getconfig('HTTP', 'baseurl')14 15 /#获取excel中的接口地址,与url进行拼接 16 self.url = self.baseurl +readexcel.getcell(row, col)17 print(self.url)18 returnself.url19 20 defgetcell(self, row, col):21 /#获取excel单元格数据,获取接口请求的参数 22 self.cell =readexcel.get_cell(row, col)23 return self.cell

⑤ 从base.py文件获取到请求地址后,需要组合不同类型的请求方式,如get请求直接将参数与地址进行拼接,或post请求以json数据格式等为请求体请求接口,然后再获取接口对象,得到接口返回的数据,此过程涉及的方法封装到request_way.py(注:该实例get请求返回数据格式为jsonp,因此需要jsonp格式数据转换为json格式的方法)

1 from Base.readExcel importReadExcel2 from base importBasePage3 importrequests4 importurllib.parse5 importjson6 importre7 8 /#实例化 9 readexcel = ReadExcel('DATABASE','dataaddress',0)10 11 /#jsonp格式数据转换为json格式 12 defjsonptojson(jsonp):13 /#解析jsonp数据格式为json 14 try:15 return json.loads(re.match("./?({./})./*", _jsonp, re.S).group(1))16 except:17 raise ValueError('Invalid Input')18 19 classRequestPage(BasePage):20 /#post方式请求,json格式为请求体 21 defpost_requests(self, url, i):22 /#定义请求数据,获取excel中参数信息赋值给data,以json格式拼接好数据 23 data_1_json = json.dumps(BasePage(self.driver).get_cell(i, 4))24 data_2_json = json.dumps(BasePage(self.driver).get_cell(i + 1, 4))25 data = "{" + data_1_json + ":" + data_2_json + "}" 26 print(data)27 /#打开请求,获取对象 28 response =requests.post(url, data)29 /#打印状态码 30 print(response)31 returnresponse32 33 /#get方式请求 34 defget_request(self, url, j):35 /#定义请求数据,获取excel中参数信息赋值给values 36 /#values = {} 37 values = BasePage(self.driver).get_cell(j, 4)38 /#如果参数不止一个则对请求数据进行编码拼接'&' 39 /#data = urllib.parse.urlencode(values) 40 /#将数据与url进行拼接 41 req = url + '?' +values42 print(req)43 /#打开请求,获取对象 44 response =urllib.request.urlopen(req)45 /#打印Http状态码 46 print(response.status)47 /#读取服务器返回的数据,对HTTPResponse类型数据进行读取操作,bytes格式数据编译成中文编码 48 the_page = response.read().decode("unicode_escape")49 /#将返回的bytes格式数据先转换成str,再将返回的jsonp格式数据转换成json格式 50 the_page =jsonp_to_json(str(the_page))51 return the_page

⑥ 得到接口实际返回结果后,需要与预期结果做比对,判断用例执行结果,所以封装校验类到check.py文件。校验方式其一是校验json数组内每个数值是否一致,其二是直接简单校验数组中的status值和message是否返回正确

1 from base importBasePage2 from Base.readExcel importWriteExcel3 4 /#实例化 5 writeexcel = WriteExcel('DATABASE','dataaddress',0)6 7 classCheckPage(BasePage):8 /#校验json数组内每个值是否一致 9 defcheckvalue(self, i, actualresult, expectresult):10 /#遍历字典的值value,并将value赋值给实际接口数据的值 11 for value inactualresult.values():12 actualresultvalue =value13 /#遍历字典的值value,并将value赋值给excel中预期数据的值 14 for value inexpectresult.values():15 expectresultvalue =value16 /#如果实际接口返回的每个键值与excel中预期返回的数据的每个键值一样,则接口测试用例执行通过,如果不是则打印预期结果和实际结果,可比较差异 17 if actualresultvalue ==expectresultvalue:18 writeexcel.setcell(i, 8, 'SUCCESS')19 print("接口用例执行结果通过")20 else:21 writeexcel.setcell(i, 8, 'FAILURE')22 writeexcel.setcell(i, 7, str(actualresult))23 print('第', i + 1, '行用例执行失败:预期结果是', expectresult, '实际结果是', actualresult)24 25 /#保存测试报告 26 writeexcel.saveexcel('testreport', '.xls')27 28 29 /#校验json数组中的status值和message是否返回成功 30 defeasycheckvalue(self, i, actualresult,expectresult):31 /#判断实际接口值是否状态码和消息返回成功 32 if actualresult['status'] == 1 and actualresult['message'] == '完成':33 writeexcel.set_cell(i, 8, 'SUCCESS')34 print('第', i+1, '行用例执行结果正确,用例通过')35 else:36 writeexcel.set_cell(i, 8, 'FAILURE')37 writeexcel.set_cell(i, 7, str(actualresult))38 print('第', i + 1, '行用例执行失败:预期结果是', expectresult, '实际结果是', actualresult)39 40 /#保存测试报告 41 writeexcel.save_excel('testreport', '.xls')

⑦ 最后编写测试集 testcase.py,其中用例包含有执行post和get方式的请求,增加用例可直接在该文件继续添加编写

1 importunittest2 from selenium importwebdriver3 from Base.readConfig importReadConfig4 from base importBasePage5 from requestsway importRequestPage6 from check importCheckPage7 from packages.HTMLTestRunner importHTMLTestRunner8 9 driver = webdriver.Chrome(ReadConfig().getconfig('DATABASE', 'driver'))10 11 classSmokeTest(unittest.TestCase):12 /#初始化 13 defsetUp(self):14 self.driver =driver15 16 deftestcase10(self):17 """以json格式数据为请求体的post方式接口请求""" 18 /#获取url 19 self.url = BasePage(self.driver).getapi(1,1)20 21 /#将接口实际返回数据转换为json可序列化,使用json.dumps()时需要对象相应的类型是json可序列化的 22 i = 3 23 actualresult =RequestPage(self.driver).postrequests(self.url, i).json()24 25 /#获取excel中的预期结果 26 expectresult = eval(BasePage(self.driver).getcell(i, 6))27 28 /#校验实际接口返回结果和用例预期结果是否一致(校验json数组内每个值是否一致) 29 CheckPage(self.driver).checkvalue(i, actualresult, expectresult)30 31 deftestcase11(self):32 """get方式接口请求""" 33 /#获取url 34 self.url = BasePage(self.driver).getapi(8, 1)35 36 /#获取接口实际返回值与excel中的预期结果 37 j = 8 38 actualresult =RequestPage(self.driver).getrequest(self.url, j)39 expectresult = eval(BasePage(self.driver).getcell(j, 6))40 41 /#校验实际接口返回结果和用例预期结果是否一致(校验json数组中的status值和message是否返回成功) 42 CheckPage(self.driver).easycheckvalue(j, actualresult, expectresult)43 44 /#释放资源 45 deftestcase12(self):46 self.driver.quit()47 48 49 if name == 'main':50 /#构造测试集合 51 suite =unittest.TestSuite()52 suite.addTest(SmokeTest('testcase10'))53 suite.addTest(SmokeTest('testcase11'))54 suite.addTest(SmokeTest('testcase12'))55 56 /#创建html文件 57 filename = ReadConfig().getconfig('DATABASE', 'report_address') + 'testreport.html' 58 fp = open(filename, 'wb')59 60 /#执行测试并生成html测试报告 61 runner = HTMLTestRunner(stream=fp, description='接口用例执行情况:', title='接口自动化测试报告')62 runner.run(suite)63 64 /#关闭文件 65 fp.close()

⑧ 其中涉及HTMLTestRunner.py原生HTML测试报告库,是用于生成测试报告testreport.html,模块下载后直接集成到该项目

模块下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

⑨ 以python文件模式执行脚本才能生成测试报告

参考:https://www.cnblogs.com/kristin/p/10332815.html

以上,整体框架如下图

 

执行方式正确得到以下两种类型测试报告,excel表和html测试报告

版权声明
本文为[kristin_n]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/kristin/p/10387970.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;