• Python+requests+unittest执行接口自动化测试


    1、安装requests、xlrd、json、unittest库

    <1>pip 命令安装:

    pip install requests
    pip install xlrd
    pip install json
    pip install unittest

    <2> pycharm里安装

    2、利用Page Object Model 设计理念创建六类Python Package(也可根据项目要求具体实施)

    3、先在base包里创建一个Base_Page.py

    <1>导入模块,并创建Base类,封装各类请求方法

    1. import requests #导入requests模块
    2. class Base():
    3. def method_post(self,url,params = None,data = None,headers = None,files = None):
    4. return requests.post(url = url,params = params,data = data,headers = headers,files = files)
    5. def method_get(self,url,params = None,data = None,headers = None,files = None):
    6. return requests.get(url = url,params = params,data = data,headers = headers,files = files)
    7. def method_put(self,url,params = None,data = None,headers = None,files = None):
    8. return requests.put(url = url,params = params,data = data,headers = headers,files = files)
    9. def method_delete(self,url,params = None,data = None,headers = None,files = None):
    10. return requests.delete(url = url,params = params,data = data,headers = headers,files = files)

    因为每一个请求都会有params参数或是data参数,但是不可能两个都存在,所以这里用了None,依次类推

    <2>适配于接口用例执行,读取Excel表时,将各类请求做判断,当符合哪一种时,就去执行哪一种

    1. def requests_type(self,method,url,params = None,data = None,headers = None,files = None):
    2. if method =='post' or method =='POST':
    3. return self.method_post(url = url,params = params,data = data,headers = headers,files = files)
    4. elif method =='get' or method =='GET':
    5. return self.method_get(url = url,params = params,data = data,headers = headers,files = files)
    6. elif method =='put' or method =='PUT':
    7. return requests.put(url = url,params = params,data = data,headers = headers,files = files)
    8. elif method =='delete' or method =='DELETE':
    9. return requests.delete(url = url,params = params,data = data,headers = headers,files = files)

    <3> 将几种请求做简单调试,调试通了,那么我们就可以进行下一项

    也可以对需要拿到cookie的接口进行封装方法保存:

    1. def Get_Login_cookie(self,data):
    2. res = self.method_post(url = "请求网址",data = data)
    3. return {"userId":str(res.json()['result']['userId']),"sessionId":res.json()['result']['sessionId']}

    之后我们要将base页验证的这些代码做清除,否则的话永远都是调的这些接口

    4、再common类下创建commons.py文件,并创建common类

    <1> 封装日志方法

    这里我添加了一个data包,用于存放xlrd表,以及html报告存放路径、log日志存放路径

    1. log_path = r'D:\PycharmProjects\自动化接口\自动化接口测试\report\logs'
    2. report_html = r'D:\PycharmProjects\自动化接口\自动化接口测试\report\html'
    3. read_xlrd = r'D:\PycharmProjects\自动化接口\自动化接口测试\data'
    4. class Common():
    5. #封装日志方法
    6. def get_logs(self,path = log_path):
    7. import logging,time
    8. logs = logging.getLogger()
    9. logs.setLevel(logging.DEBUG)
    10. path = path+'/' + time.strftime('%Y-%m-%d-%H-%M-%S') + '.log'
    11. write_file = logging.FileHandler(path,'a+',encoding='utf-8')
    12. write_file.setLevel(logging.DEBUG)
    13. set_logs = logging.Formatter('%(asctime)s - %(filename)s - %(funcName)s - %(levelname)s - %(message)s')
    14. write_file.setFormatter(set_logs)
    15. pycharm_text = logging.StreamHandler()
    16. pycharm_text.setFormatter(set_logs)
    17. logs.addHandler(write_file)
    18. logs.addHandler(pycharm_text)
    19. return logs

    <2> 封装读取Excel表方法,把他转换成字典形式,方便json格式读取

    1. # 读取Excel表方法,方便后续读取接口用例数据
    2. def ReadExcelTypeDict(self,file_name,path = read_xlrd):
    3. path = path+'/' + file_name
    4. import xlrd
    5. work_book = xlrd.open_workbook(path) # 打开Excel表
    6. sheets = work_book.sheet_names() # 获取所有的sheets页
    7. DatasList = []
    8. for sheet in sheets:
    9. sheets = work_book.sheet_by_name(sheet)
    10. nrows = sheets.nrows
    11. for i in range(0,nrows):
    12. values = sheets.row_values(i)
    13. DatasList.append(values)
    14. title_list = DatasList[0]
    15. content_list = DatasList[1:]
    16. new_list = []
    17. for content in content_list:
    18. dic = {}
    19. for i in range(len(content)):
    20. dic[title_list[i]] = content[i]
    21. new_list.append(dic)
    22. return new_list #最终返回为字典形式 有键和值

    为什么要转换格式呢?
    这里就涉及到了怎么设计一个自动化接口用例

    用例的参数值要用json格式写入,不要有空格
    预期结果的出参也要用json格式写入
    不要有' '值都要用" "包起来

    <3>封装一个生成HTML报告方法

    1. # 封装一个HTML报告方法
    2. def GetHtmlResult(self,suite,title,path = report_html):
    3. import HTMLTestReportCN,time
    4. path = path + '/' + time.strftime('%Y-%m-%d-%H-%M-%S') + '.html'
    5. with open(path,'wb+') as f:
    6. run = HTMLTestReportCN.HTMLTestRunner(stream=f,description='用户相关接口测试报告',tester='小白',title = title)
    7. run.run(suite)

    其余还有需要补充的可以继续添加,我这里三个基本够用

    5、在case包下创test用例,并调用我们在base页封装好的请求api以及common中的读取Excel数据表联合使用

    <1>创建test_login.py

    <2> 导入unittest、common类下的commons类、ddt数据驱动、Base下的base_page页

    1. import unittest
    2. import ddt
    3. import 自动化接口测试.common.commons as common
    4. from 自动化接口测试.base.Base_Page import Base

    <3> 搭建unittest框架内部,并填充方法

    1. import unittest
    2. import ddt
    3. import 自动化接口测试.common.commons as common
    4. from 自动化接口测试.base.Base_Page import Base
    5. r = common.Common().ReadExcelTypeDict('cezxhi .xlsx') # 拿到具体的Excel表数据
    6. @ddt.ddt #导入ddt模块
    7. class TestLogin(unittest.TestCase):
    8. @classmethod
    9. def setUpClass(cls) -> None: # setupclass类方法 全部用例开始前执行一次
    10. cls.logs = common.Common().get_logs() # 导入日志方法
    11. cls.logs.debug('开始写入接口自动化测试用例')
    12. @classmethod
    13. def tearDownClass(cls) -> None:
    14. cls.logs.debug('自动化接口用例结束')
    15. def setUp(self) -> None:
    16. self.logs.debug('开始本条接口用例')
    17. def tearDown(self) -> None:
    18. self.logs.debug('结束本条用例')
    19. @ddt.data(*r) # 引入ddt模块,读取拿到的数据
    20. def test_logins(self,pars): # 用例方法名开头必须已test pars参数为接收的表数据值
    21. import json #导入json模块
    22. dic = json.loads(pars['body参数值']) # 将Excel数据中的参数值转变为json格式
    23. url = pars['接口地址'] # 拿到请求url
    24. yuqi = pars['预期结果'] # 拿到预期结果
    25. fs = pars['请求方式'] # 拿到请求方式
    26. result = Base().requests_type(method = fs,url = url,data = dic) # 填充base页的请求api
    27. self.assertEqual(result.text,yuqi) # 进行断言 看用例是否通过

    <4> 执行用例后生成测试报告:

    1. if __name__ == '__main__':
    2. load = unittest.TestLoader().loadTestsFromTestCase(TestLogin) #使用loader加载方式 来找寻所有已test开头的用例
    3. suite = unittest.TestSuite([load,])
    4. common.Common().GetHtmlResult(suite,'登录测试用例')

    <5> copy当前要执行的脚本路径,添加到运行方式为python里

    最后我们run一下

    控制台是这样的

    为什么会有400呢?因为有一些接口是异常的,比如url错误的,少传入参数、空参,所以会出错,常理之中

    <6> 看下生成的测试报告

    在pycharm中是这样的

    然后我们copy下他的路径到浏览器中查看

    根据我追踪的信息,第一条失败是因为sessionId是可以变的,每一次的值都是不一样,在这里也希望大家能够找到BUG,并妥善处理好每一个问题。

    最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

  • 相关阅读:
    Webshell上传方式
    腾讯云微服务平台 TSF 异地多活单元化能力重磅升级
    IMU积分、预积分、误差
    java基础10题
    什么灯适合学生在暑假使用?照度国AA级的舒适护眼灯
    mysql主从基于docker实现,django实现读写分离
    记录:Unity脚本的编写3.0
    swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5)
    从 Clickhouse 到 Snowflake(一): 云原生
    FMCW雷达差频回波信号仿真
  • 原文地址:https://blog.csdn.net/okcross0/article/details/126752070