51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

测试开发精英班,通向高级软件测试工程师2022年软件评测师考前培训开始啦!项目为王,自动化测试提升加速器 !企业级云端项目实战云集,晋升测试开发复合型人才
【128期】:一个测试工程师如何考虑自己的未来?《51测试 天地》精选好文 测试人职业发展! 【活动】为视频UP主打CALL,互动领福利!
查看: 178|回复: 0

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

[复制链接]
  • TA的每日心情
    郁闷
    昨天 09:14
  • 签到天数: 567 天

    连续签到: 2 天

    [LV.9]测试副司令

    发表于 2022-6-24 09:31:41 | 显示全部楼层 |阅读模式
     一、Requests介绍
      Requests is an elegant and simple HTTP library for Python, built for human beings.

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

    1. import requests
    2.   
    3.   # 发送请求
    4.   response = requests.get(url="http://www.baidu.com/s", params={'wd':'python'})
    5.   # 处理响应
    6.   print(response.status_code)
    7.   
    8.   #返回
    复制代码
     这个请求如果用 urllib 来实现,代码如下:

    1.  import urllib.parse
    2.   import urllib.request
    3.   
    4.   url = "http://www.baidu.com/s"
    5.   params = urllib.parse.urlencode({'wd':'python'})
    6.   # 发送请求
    7.   response = urllib.request.urlopen('?'.join([url, params]))
    8.   # 处理响应
    9.   print(response.getcode())
    10.   
    11.   #返回
    复制代码
    从感官上就能看出来,使用 urllib 在 URL 、参数等方面会复杂一些。这只是冰山一角,实际使用中 Requests 还有好多方面超越 urllib ,它并不是浪得虚名,接下来的学习中你就会感受到。
      二、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的调用,所有公共的、一成不变的数据都可以放在这里,维护也方便。
      配置文档如下:
    1.  [DATABASE]
    2.   data_address = ./data/
    3.   report_address = ./report/
    4.   
    5.   [HTTP]
    6.   base_url = http://xxx.xx
    复制代码
     想知道怎样从配置文档中得到或写入相应的数据吗?那继续看吧。
    1. import os
    2.   import configparser
    3.   
    4.   # 获取当前py文件地址
    5.   proDir = os.path.split(os.path.realpath(__file__))[0]
    6.   # 组合config文件地址
    7.   configPath = os.path.join(proDir,"config.ini")
    8.   
    9.   class ReadConfig:
    10.       def __init__(self):
    11.           #获取当前路径下的配置文件
    12.           self.cf = configparser.ConfigParser()
    13.           self.cf.read(configPath)
    14.   
    15.       def get_config(self,field,key):
    16.           #获取配置文件中的key值
    17.           result = self.cf.get(field,key)
    18.           return result
    19.   
    20.       def set_config(self,field,key,value):
    21.           #向配置文件中写入配置信息
    22.           fb = open(configPath,'w')
    23.           self.cf.set(field,key,value)
    24.           self.cf.write(fb)
    25.   
    复制代码
      那问题又来了,我们的测试数据放在哪里?怎么取值?怎么写入?怎么保存?
      别急,接着往下看。
      测试数据优先考虑放在excel或database中,此处以excel为例做个简单介绍。
      这里需要用到两个操作表格的库,xlrd数据驱动的读取,作用于excel文档,但xlrd不能写入数据,所以引入xlutils数据驱动的读取和写入。
      安装方法可以用pip3 install xlrd和pip3 install xlutils 来安装。
    1. import xlrd
    2.   import xlutils.copy
    3.   from Base.readConfig import ReadConfig
    4.   import time
    5.   
    6.   class ReadExcel:
    7.   
    8.       def __init__(self,section,field,sheet):
    9.           # 打开工作表,并定位到sheet
    10.           data_address = ReadConfig().get_config(section,field)
    11.           workbook = xlrd.open_workbook(data_address)
    12.           self.table = workbook.sheets()[sheet]
    13.   
    14.   
    15.       def get_rows(self):
    16.           # 获取excel行数
    17.           rows = self.table.nrows
    18.           return rows
    19.   
    20.       def get_cell(self,row,col):
    21.           # 获取单元格数据
    22.           cell_data = self.table.cell(row,col).value
    23.           return cell_data
    24.   
    25.       def get_col(self,col):
    26.           # 获取整列数据
    27.           col_data = self.table.col_value(col)
    28.           return col_data
    29.   
    30.   class WriteExcel:
    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.       def set_cell(self,row,col,value):
    39.           #设置单元格数据
    40.           self.ws.write(row,col,value)
    41.   
    42.       def save_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 + format
    47.           #保存文件
    48.           self.wf.save(self.report)
    复制代码
    然后,测试脚本的编辑
      一切准备就绪,下面通过一个简单的、完整的代码进行演示公共函数的调用,框架的使用及报告的生成。
    1.  import unittest
    2.   import requests
    3.   from Base.readConfig import ReadConfig
    4.   from Base.readExcel import ReadExcel
    5.   from Base.readExcel import WriteExcel
    6.   #实例化
    7.   readexcel = ReadExcel('DATABASE','data_address',0)
    8.   writeexcel = WriteExcel('DATABASE','data_address',0)
    9.   
    10.   class testcase(unittest.TestCase):
    11.       #初始化
    12.       def setUp(self):
    13.           #获取url
    14.           self.base_url = ReadConfig().get_config('HTTP', 'base_url')
    15.           self.url = self.base_url + readexcel.get_cell(1,1)
    16.           #获取请求头
    17.           self.headers = readexcel.get_cell(1,4)
    18.   
    19.       def test_case(self):
    20.           nok = 0
    21.           ner = 0
    22.           # 循环读取excel中的测试数据,进行结果验证,并生成excel形式的测试报告
    23.           for i in range(3,readexcel.get_rows()):
    24.               #发送网络请求,得到响应值
    25.               response = requests.post(self.url, headers=self.headers,   data=readexcel.get_cell(i,4).encode('utf-8'))
    26.               actualresult = response.json()
    27.               #获取excel中的预期结果
    28.               expectresult = eval(readexcel.get_cell(i,6))
    29.               # 获取需验证的数据
    30.               key = eval(readexcel.get_cell(i, 5))
    31.               keylen = len(key)
    32.               j = 0
    33.               for k in range(keylen):
    34.                   aresult = 'actualresult' + key[k]
    35.                   eresult = 'expectresult' + key[k]
    36.                   if eval(aresult) == eval(eresult):
    37.                       #预期结果和实际结果一致
    38.                       j = j + 1
    39.               if j == keylen:
    40.                   #测试数据执行通过
    41.                   nok = nok + 1
    42.                   writeexcel.set_cell(i, 8, 'SUCCESS')
    43.               else:
    44.                   # 测试数据执行失败,并将实际结果写入excel
    45.                   ner = ner + 1
    46.                   writeexcel.set_cell(i, 8, 'FAILURE')
    47.                   writeexcel.set_cell(i, 7, str(actualresult))
    48.                   print('第', i + 1, '行用例执行失败:预期结果是', expectresult, '实际结果是', actualresult)
    49.               # 保存测试报告
    50.               writeexcel.save_excel('testreport', '.xls')
    51.               print('测试数据中总共', nok, '条用例执行通过', ner, '条用例执行失败')
    52.   
    53.       #释放资源
    54.       def tearDown(self):
    55.           pass
    56.   
    57.   if __name__ == '__main__':
    58.       #构造测试集合
    59.       suite = unittest.TestSuite()
    60.       suite.addTest(testcase('test_case'))
    61.       #创建html文件
    62.       filename = ReadConfig().get_config('DATABASE', 'report_address') + 'testreport.html'
    63.       fb = open(filename,"wb")
    64.       #执行测试并生成html测试报告
    65.       runner = HTMLTestRunner.HTMLTestRunner(stream = fb,description = '针对接口的描述信息',title = '某某的自动化测试报告')
    66.       runner.run(suite)
    67.       #关闭文件
    68.       fb.close()
    复制代码
    最后,生成的html报告






    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2022-8-10 16:36 , Processed in 0.057028 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2022 Comsenz Inc.

    快速回复 返回顶部 返回列表