多测师是一家拥有先进的教学理念,强大的师资团队,业内好评甚多的接口自动化测试培训机构!

17727591462

联系电话

您现在所在位置:接口自动化测试培训 > 新闻资讯

Python3+requests+unittest接口自动化测试实战

更新时间:2022-07-04 09:12:36 作者:多测师 浏览:25

  一、Requests介绍

  Requests is an elegant and simple HTTP library for Python, built for human beings.

  翻译过来就是:Requests 是为人类写的一个优雅而简单的 Python HTTP 库。这个介绍很直白了,让我们先来感受一下 Requests 的威力。

  import requests

  # 发送请求

  response = requests.get(url="http://www.baidu.com/s", params={'wd':'python'})

  # 处理响应

  print(response.status_code)

  #返回

  这个请求如果用 urllib 来实现,代码如下:

  import urllib.parse

  import urllib.request

  url = "http://www.baidu.com/s"

  params = urllib.parse.urlencode({'wd':'python'})

  # 发送请求

  response = urllib.request.urlopen('?'.join([url, params]))

  # 处理响应

  print(response.getcode())

  #返回

  从感官上就能看出来,使用 urllib 在 URL 、参数等方面会复杂一些。这只是冰山一角,实际使用中 Requests 还有好多方面超越 urllib ,它并不是浪得虚名,接下来的学习中你就会感受到。

Python3+requests+unittest接口自动化测试实战

  二、unittest介绍

  说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是unittest。 的确,作为 Python 的标准库,它很优秀,并被广泛用于各个项目。但你知道吗?其实在 Python 众多项目中,主流的单元测试框架远不止这一个。

  本系列文章将为大家介绍目前流行的 Python 的单元测试框架,讲讲它们的功能和特点并比较其异同,以让大家在面对不同场景、不同需求的时候,能够权衡利弊,选择最佳的单元测试框架。

  三、Python3+requests+unittest

  首先,我们可以捋一捋思路,想一想接口测试的流程

  其次,选择合适的框架。

  流程清晰之后,我们需要选择一个合适的框架,于是选择了Python3+requests+unittest框架。

  Requests模块发送http的网络请求,请求类型主要包含了post,get, PUT,DELETE,HEAD。python+unittest单元测试框架构成,和测试报告生成(HTMLTestRunner)。框架详解不在此赘述。

  基于以上,我们来一步步搭建我们的框架。在这个过程中,我们需要做到业务和数据的分离,这样才能灵活,达到我们写框架的目的。接下来,我们来进行结构的划分。

  我们的结构是这样的:

  data:存放自动化测试所用到的数据文档。

  log:存放生成的日志文件。

  base:存放公共的方法。

  report:存放生成的自动化测试报告。

  testcase:存放测试脚本。

  接下来,公共方法的开发

  整体结构有了划分,接下来就该一步步的填充整个框架了,我们先来看看Base文件中的公共类或函数,这主要用于后续测试case的调用,所有公共的、一成不变的数据都可以放在这里,维护也方便。

  配置文档如下:

  [DATABASE]

  data_address = ./data/

  report_address = ./report/

  [HTTP]

  base_url = http://xxx.xx

  想知道怎样从配置文档中得到或写入相应的数据吗?那继续看吧。

  import os

  import configparser

  # 获取当前py文件地址

  proDir = os.path.split(os.path.realpath(__file__))[0]

  # 组合config文件地址

  configPath = os.path.join(proDir,"config.ini")

  class ReadConfig:

  def __init__(self):

  #获取当前路径下的配置文件

  self.cf = configparser.ConfigParser()

  self.cf.read(configPath)

  def get_config(self,field,key):

  #获取配置文件中的key值

  result = self.cf.get(field,key)

  return result

  def set_config(self,field,key,value):

  #向配置文件中写入配置信息

  fb = open(configPath,'w')

  self.cf.set(field,key,value)

  self.cf.write(fb)

  那问题又来了,我们的测试数据放在哪里?怎么取值?怎么写入?怎么保存?

  别急,接着往下看。

  测试数据优先考虑放在excel或database中,此处以excel为例做个简单介绍。

  这里需要用到两个操作表格的库,xlrd数据驱动的读取,作用于excel文档,但xlrd不能写入数据,所以引入xlutils数据驱动的读取和写入。

  安装方法可以用pip3 install xlrd和pip3 install xlutils 来安装。

  import xlrd

  import xlutils.copy

  from Base.readConfig import ReadConfig

  import time

  class ReadExcel:

  def __init__(self,section,field,sheet):

  # 打开工作表,并定位到sheet

  data_address = ReadConfig().get_config(section,field)

  workbook = xlrd.open_workbook(data_address)

  self.table = workbook.sheets()[sheet]

  def get_rows(self):

  # 获取excel行数

  rows = self.table.nrows

  return rows

  def get_cell(self,row,col):

  # 获取单元格数据

  cell_data = self.table.cell(row,col).value

  return cell_data

  def get_col(self,col):

  # 获取整列数据

  col_data = self.table.col_value(col)

  return col_data

  class WriteExcel:

  def __init__(self,section,field,sheet):

  # 打开工作表

  self.address = ReadConfig().get_config(section,field)

  self.workbook = xlrd.open_workbook(self.address)

  self.wf = xlutils.copy.copy(self.workbook)

  self.ws = self.wf.get_sheet(sheet)

  def set_cell(self,row,col,value):

  #设置单元格数据

  self.ws.write(row,col,value)

  def save_excel(self,filename,format):

  #获取当前时间

  self.time = time.strftime("%Y%m%d%H%M%S", time.localtime())

  #生成文件的文件名及格式

  self.report = filename + '_' +self.time + format

  #保存文件

  self.wf.save(self.report)

  然后,测试脚本的编辑

  一切准备就绪,下面通过一个简单的、完整的代码进行演示公共函数的调用,框架的使用及报告的生成。

  import unittest

  import requests

  from Base.readConfig import ReadConfig

  from Base.readExcel import ReadExcel

  from Base.readExcel import WriteExcel

  #实例化

  readexcel = ReadExcel('DATABASE','data_address',0)

  writeexcel = WriteExcel('DATABASE','data_address',0)

  class testcase(unittest.TestCase):

  #初始化

  def setUp(self):

  #获取url

  self.base_url = ReadConfig().get_config('HTTP', 'base_url')

  self.url = self.base_url + readexcel.get_cell(1,1)

  #获取请求头

  self.headers = readexcel.get_cell(1,4)

  def test_case(self):

  nok = 0

  ner = 0

  # 循环读取excel中的测试数据,进行结果验证,并生成excel形式的测试报告

  for i in range(3,readexcel.get_rows()):

  #发送网络请求,得到响应值

  response = requests.post(self.url, headers=self.headers, data=readexcel.get_cell(i,4).encode('utf-8'))

  actualresult = response.json()

  #获取excel中的预期结果

  expectresult = eval(readexcel.get_cell(i,6))

  # 获取需验证的数据

  key = eval(readexcel.get_cell(i, 5))

  keylen = len(key)

  j = 0

  for k in range(keylen):

  aresult = 'actualresult' + key[k]

  eresult = 'expectresult' + key[k]

  if eval(aresult) == eval(eresult):

  #预期结果和实际结果一致

  j = j + 1

  if j == keylen:

  #测试数据执行通过

  nok = nok + 1

  writeexcel.set_cell(i, 8, 'SUCCESS')

  else:

  # 测试数据执行失败,并将实际结果写入excel

  ner = ner + 1

  writeexcel.set_cell(i, 8, 'FAILURE')

  writeexcel.set_cell(i, 7, str(actualresult))

  print('第', i + 1, '行用例执行失败:预期结果是', expectresult, '实际结果是', actualresult)

  # 保存测试报告

  writeexcel.save_excel('testreport', '.xls')

  print('测试数据中总共', nok, '条用例执行通过', ner, '条用例执行失败')

  #释放资源

  def tearDown(self):

  pass

  if __name__ == '__main__':

  #构造测试集合

  suite = unittest.TestSuite()

  suite.addTest(testcase('test_case'))

  #创建html文件

  filename = ReadConfig().get_config('DATABASE', 'report_address') + 'testreport.html'

  fb = open(filename,"wb")

  #执行测试并生成html测试报告

  runner = HTMLTestRunner.HTMLTestRunner(stream = fb,description = '针对接口的描述信息',title = '某某的自动化测试报告')

  runner.run(suite)

  #关闭文件

  fb.close()

  以上内容为大家介绍了Python3+requests+unittest接口自动化测试实战,本文由多测师亲自撰写,希望对大家有所帮助。了解更多接口自动化测试相关知识:https://www.aichudan.com/xwzx/

联系电话

17727591462

返回顶部