多测师肖sir___接口自动化测试框架(python+request+unittest+ddt)讲解版

python+request+unittest+ddt

一、接口自动化测试框架(python+request+unittest+ddtj 7个包)讲解
首先我们新建一个新项目:名称zdh
二、在一个项目中:新建7个包
第一个包conf包用来填写配置参数、地址等
第二个包data 包用来存放测试用例的表格
第三个包report 包用来存放测试报告
第四个包case 用例包 用来编写测试用例
第五个包run包 运行包 用来运行所有的用例或邮件等
第六个包utils 包 工具类包 存放所有自己封装的语句和外包导入的工具函数
第7个包library包 外包导入的工具函数 如邮件模板,报告模板

二、将写好的模板发送给学员
1、代码包
在这里插入图片描述

2、结构图
在这里插入图片描述
三、框架的讲解

1.新建一个项目
在这里插入图片描述
2、新建7个包
在这里插入图片描述
3、在utils中新建:handle_path .py 文件 (组建项目中所有路径)

import  os  #导入os模块
#项目路径  #获取项目路径
base_path=os.path.dirname(os.path.dirname(__file__))  #__file__: 这是一个特殊的变量,表示当前执行的脚本文件的路径
#使用 os.path.dirname() 函数获取 __file__ 所代表的文件的目录名
#语句对上一步返回的目录路径执行此操作
print(base_path)
或者:
p=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(p)
----------------------------------------------------------------
data_path=os.path.join(base_path,'data')
print(data_path) #定义data路径
conf_path=os.path.join(base_path,'conf')
print(conf_path)#定义conf路径
report_path=os.path.join(base_path,'report')
print(report_path)#定义report路径
testcase_path=os.path.join(base_path,'testcase')
print(testcase_path)#定义testcase路径
utils_path=os.path.join(base_path,'utils')
print(utils_path)#定义utils路径
run_path=os.path.join(base_path,'run')
print(run_path)#定义run路径

4、在conf文件中新建一个:ini文件 (命名:conf.ini)
ini文件格式(节点 下面 :键=值 ) 节点:section 键值:option

[env]  #section   #节点
url =http://cms.e70w.com      ##section     url就是键#是option       http://cms.e70w.com 是值
headers = {"Content-Type":"application/x-www-form-urlencoded"}
[test_data]
username = admin
pwd = 123456
[db]
[email]

案例:
比如:
[test_data]
url = http://cms.duoceshi.cn/cms/manage/login.do
username = admin
password = 123456
[exception_data_1]
username = admin
password = 654321
[exception_data_2]
username = admin111
password = 654321
[mysql_data]
host_name = 192.168.1.1
port = 3306
username = 1233333
[useradd_data]
username = dcs123
password = 123456
phoneno = 13566667777
useremail = 12345@qq.com
useraccount = admin8765
userpwd = 123456
在这里插入图片描述
新建完ini文件以后,我们要读取ini文件中的数据,我们在utils下封装一个读取方法:

5、在utils下新建py文件:命名 handle_conf
我们要读取ini文件先导入configparser 这个模块:pip install configparser

'''
此模块是用来处理conf.ini文件的
'''
from configparser import ConfigParser
from utils.handle_path import *
import os
class Handle_conf(ConfigParser):
    '''
    当前这个类是用来处理conf.ini文件的工具类
    '''
    def __init__(self,filename):
        super(Handle_conf,self).__init__()  #继承父类的构造方法  #super() 函数,它是一个子类中调用父类的方法;
        #super() 函数返回一个临时对象,这个临时对象代理了父类,允许你在子类中访问父类的方法。实际就是 __init__() 调用了父类的构造函数
        self.filename = filename  #把传进来的形式参数赋值给到实例变量self.filename,#类的每个实例都会有一个与之关联的filename属性
        self.read(self.filename)  #打开ini文件进行读取
        #调用了ConfigParser类的read方法,用于读取与实例关联的.ini文件。这行代码应该在构造函数中执行,以确保在继续使用之前文件已经被读取

    def get_value(self,section,option):  #定义一个函数get_value读取:ini 文件,
        '''
        获取ini文件中的section下面对应的option的value值
        '''
        value = self.get(section,option)  #get 方法负责从INI文件中检索指定section下指定option的值,并将结果赋值给 value 变量
        return value   #return返回
path = os.path.join(conf_path,'conf.ini')
conf =Handle_conf(path) #创建一个conf的对象
print(conf.get_value('env','url'))   #获取url
print(conf.get_value('env','headers')) #获取headers


=================================
6、在data包中新建一个xlsx文件(接口用例):
在这里插入图片描述
在这里插入图片描述
以上是将接口文档写好,写好之后就要读取文档中的数据
7、在utils 中新建一个读取xlsx文档的py文件:命名为(handle_excel.py)
因为读取和写入都要用到openpyxl这个库;下载openpyxl:
pip install openpyxl
在这里插入图片描述

import   openpyxl
from  utils.handle_path import *
class  Handle_Excel(object):
    def  __init__(self ,filename,sheet_name):
        self.filename=filename
        self.sheet_name=sheet_name
    def open(self):
        self.wb=openpyxl.load_workbook(self.filename)
        self.sh=self.wb[self.sheet_name]
    def  read_data(self):
        self.open()
        datas=list(self.sh.rows)
        # print(datas)
        title=[ i.value for  i  in  datas[0]]
        print(title) #
        cases=[]
        for j in datas[1:]:     #切片  #对第2,3,4,5,6......行进行遍历
            values=[k.value  for  k  in  j]  #然后通过对j进行遍历,用k.value获取没有用例对象中value值,然后放在一个列表
            # print(values)
            case=dict(zip(title,values))  #把title列表和values每个用例一一对应打包放进一个字典当中
            # print(case)
            cases.append(case)
        return  cases
    def  write_excel(self,row,colume,value):
        self.open() ##打开表格
        self.sh.cell(row,colume,value) # #往固定的row行和column列写入value数据
        self.wb.save(self.filename) #svae保存数据
if __name__ == '__main__':
    path=os.path.join(data_path,'apicase.xlsx')
    read_excel=Handle_Excel(path,'login')
    # read_excel.read_data()
    read_excel.write_excel(2,8,'通过')

以上能够读取xlsx 中的表格数据

==========================
8、数据准备好,接下来我们调用方法:在utils中封住一个调用方法:handle_requests.py(命名)
开始要导入 impost requests 导入requests 请求

import   requests
class Send_requests(object):
      def __init__(self):
          self.session=requests.Session()
      def  send(self,method,url,data=None,json=None,params=None,headers=None):
          method=method.lower()
          if method == 'get':
              response=self.session.get(url,params)
          elif method=='post':
              response = self.session.post(url, data,headers)
          elif  method =='post_json':
              response = self.session.post(url, json ,headers)
          elif  method =='delete':
              response = self.session.delete(url,data)
          return  response

# if __name__ == '__main__':
#     dx = Send_requests()
#     method='post'
#     url="http://cms.e70w.com/manage/loginJump.do"
#     data={"userAccount":"admin","loginPwd":"123456"}
#     headers = {"Content-Type": "application/x-www-form-urlencoded"}
#     s=dx.send(method=method,url=url,data=data,headers=headers)
#     print(s.text)

以上是封装好的调用方法,接下来我们开始写用例

=============================================

9、写用例就在testcase 包中: 新建一个用例模块,命名(test_login)

import  unittest
from   ddt  import   ddt  ,data
from   utils.handle_conf import *
from  utils.handle_excel import *
from   utils.handle_path import  *
from   utils.handle_requests import Send_requests
case_file=os.path.join(data_path,'apicase.xlsx')
@ddt
class  Test_Login(unittest.TestCase):
      excel=Handle_Excel(case_file,'login')
      cases=excel.read_data()
      request=Send_requests()

      @data(*cases)
      def  test_01_login(self,case):
          url=conf.get_value('env','url')+case['url']
          # print(url)
          # eval  函数是用来执行一个字符串表达式,并返回表达式值 
           #eval() 是 Python 中的一个内置函数,这个函数可以用于动态地计算和返回值。
          headers=eval(conf.get_value('env','headers'))
          # print(headers)
          method=case['method']
          # print(method)
          data=eval(case['data'])
          # print(data)
          excepted=eval(case['excepted'])
          # print(excepted)
          case_id=case['case_id']
          case_id=case_id+1
          response=self.request.send(method=method,url=url,data=data,headers=headers,)
          result=response.json()
          print(result)
          try:#try尝试去执行代码
              self.assertEqual(excepted['msg'],result['msg'])
              self.assertEqual(excepted['code'], result['code'])
          except Exception as e: #捕捉异常
              self.excel.write_excel(case_id,8,'未通过')
          else:
              self.excel.write_excel(case_id,8,'通过')
# if __name__ == '__main__':
# #     dx=Test_Login()
# #     dx.test_01_login()

# if __name__ == '__main__':
#     unittest.main()

以上是将准备的数据和封装好的调用方法都导入,在调用所有的数据组建好,并进行断言回写,写好登录以后,要进行run运行

==================================================
10、在run包中新建一个包:run_allcase包,

import  time
from   library.HTMLTestRunnerNew import HTMLTestRunner
from  utils.handle_path import *
import unittest
from   library.mail import  SendMail

now=time.strftime('%y-%m-%d  %H-%M-%S')
filename=report_path+'/'+str(now)+'__api_report.html'
def  fs():
    d=unittest.TestLoader().discover(start_dir=testcase_path,pattern='test_*.py')
    f=open(filename,'bw')
    r=HTMLTestRunner(stream=f,title='cms平台接口自动自动化测试报告',description="用例执行情况",
                     tester='dcs')
    r.run(d)
    f.close()
def   syj():
   sm=SendMail(send_msg=filename,attachment=filename)
   sm.send_mail()
if __name__ == '__main__':
    fs()
    # syj()

以上是通过html 模板,邮件模板进行运行的;我们要在library中导入模板
11、library中导入两个模板:HTMLTestRunnerNew.py ,mail.py
在这里插入图片描述
以上就整个框架就完成了整体结构:

==================================================
12、但是新增接口需要保持登录状态,
所以我们就要封装一个公共登录方法:
在utils中:handle_login.py文件 ,封装一个登录方法如下

from  utils.handle_conf import  conf
from  utils.handle_requests import Send_requests
class  Cms_login():
    def  login(self):
        request=Send_requests()
        url=conf.get_value('env','url')+'/manage/loginJump.do'
        data={"userAccount":"admin","loginPwd":"123456"}
        headers=conf.get_value('env','headers')
        response=request.send(method='post',url=url,data=data,headers=headers)
        print(response.json())
        return request

# if __name__ == '__main__':
#         dx=Cms_login()
#         dx.login()

==================================================
13、然后添加用例就在testcase中新增test_updateloginpwd.py 文件,可以将登录中的方法复制过来;修改一下三个地方

import  unittest
from   ddt  import   ddt  ,data
from   utils.handle_conf import *
from  utils.handle_excel import *
from   utils.handle_path import  *
from   utils.handle_requests import Send_requests
from  utils.handle_login import Cms_login     #第一地方:导入登录方法
case_file=os.path.join(data_path,'apicase.xlsx') 
@ddt
class  Test_Login(unittest.TestCase):
      excel=Handle_Excel(case_file,'updateLoginPwd')   #第二个地方修改 sheetname页面名称
      cases=excel.read_data()
      request=Send_requests()
      @classmethod   #第三个地方     通过类方法  调用登录
      def  setUpClass(cls) -> None:
          cls.request=Cms_login().login()  #调用公共登录方法

      @data(*cases)
      def  test_01_login(self,case):
          url=conf.get_value('env','url')+case['url']
          # print(url)
          # eval  函数是用来执行一个字符串表达式,并返回表达式值
          headers=eval(conf.get_value('env','headers'))
          # print(headers)
          method=case['method']
          # print(method)
          data=eval(case['data'])
          # print(data)
          excepted=eval(case['excepted'])
          # print(excepted)
          case_id=case['case_id']
          case_id=case_id+1
          response=self.request.send(method=method,url=url,data=data,headers=headers,)
          result=response.json()
          print(result)
          try:
              self.assertEqual(excepted['msg'],result['msg'])
              self.assertEqual(excepted['code'], result['code'])
          except Exception as e:
              self.excel.write_excel(case_id,8,'未通过')
          else:
              self.excel.write_excel(case_id,8,'通过')
# if __name__ == '__main__':
# #     dx=Test_Login()
# #     dx.test_01_login()

if __name__ == '__main__':
    unittest.main()

==================================================
14、还要添加用例就在testcase中新增test_delete.py 文件,将修改密码内容复制过来,在修改下如下sheetname页面名就可以

import  unittest
from   ddt  import   ddt  ,data
from   utils.handle_conf import *
from  utils.handle_excel import *
from   utils.handle_path import  *
from   utils.handle_requests import Send_requests
from  utils.handle_login import Cms_login
case_file=os.path.join(data_path,'apicase.xlsx')
@ddt
class  Test_Login(unittest.TestCase):
      excel=Handle_Excel(case_file,'delete')  # 修改的地方"delete"
      cases=excel.read_data()
      request=Send_requests()
      @classmethod
      def  setUpClass(cls) -> None:
          cls.request=Cms_login().login()

      @data(*cases)
      def  test_01_login(self,case):
          url=conf.get_value('env','url')+case['url']
          # print(url)
          # eval  函数是用来执行一个字符串表达式,并返回表达式值
          headers=eval(conf.get_value('env','headers'))
          # print(headers)
          method=case['method']
          # print(method)
          data=eval(case['data'])
          # print(data)
          excepted=eval(case['excepted'])
          # print(excepted)
          case_id=case['case_id']
          case_id=case_id+1
          response=self.request.send(method=method,url=url,data=data,headers=headers,)
          result=response.json()
          print(result)
          try:
              self.assertEqual(excepted['msg'],result['msg'])
              self.assertEqual(excepted['code'], result['code'])
          except Exception as e:
              self.excel.write_excel(case_id,8,'未通过')
          else:
              self.excel.write_excel(case_id,8,'通过')
# if __name__ == '__main__':
# #     dx=Test_Login()
# #     dx.test_01_login()

if __name__ == '__main__':
    unittest.main()

然后在到run包去点击运行,查看report中的报告模板,查看结果如下
在这里插入图片描述

以上就是框架的一个流程。

================================================================
二、python+request+unittest+ddt 整理成word文档讲解稿(参考)
案例1:
我讲下我做的接口自动化是python+request+unittest+ddt 实现的,下面我介绍整个框架的结构有7层以及每个包中的内容:
第1层的话是config配置层,这个里面主要是封装了一些我们测试环境的url地址和一些连接数据库的IP地址,用户名密码等等
第2层是data数据层,这个里面主要放的是接口的用例,把接口的入参,接口的路径,接口的编号,请求方法都放在这个里面了,一个接口放在一个sheet页面里面,然后一个sheet页面里面有多个接口测试用例,有正常场景的也有多个异常场景的
第3层是一个library第三方的公共库层,里面主要是放了发邮件的工具类,生成测试报告的工具类还有做数据驱动的ddt模块
第4层就是utils工具类层,主要封装了读取Excel表格,读取ini配置文件和发送接口请求的工具类
第5层就是testcase用例层,这个里面首先会创建一个类,然后在里面创建以test开头的方法,然后定义一个data装饰器主要是用来接受Excel表格里面的接口入参,第一步先做数据的处理,然后第二步再通过封装好的发接口请求的工具类发送接口请求得到response返回值,第三步再对接口进行断言,一般会对接口返回的状态码和返回的比较具有唯一性的文本信息进行断言
第6层就是run运行层,首先会通过把所有的用例加载到一个suite套件里面,然后再通过调用run方法运行这个套件,并且通过HTMLtestrunner模块生成测试报告放到
第7层报告层里面,然后最后通过Jenkins做可持续集成,在回归测试阶段,每天晚上都会运行一下我们的接口自动化用例,大致的一个框架结构就是这样的。

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Pythonunittest库提供了一种基于单元测试的测试框架,是一个方便易用的Python测试框架。使用unittest库进行接口自动化测试可以提高测试效率和质量,本文将分享如何使用Python unittest库搭建接口自动化测试框架。 第一步:安装Python unittest库 首先需要安装Python unittest库,Python unittest库是默认安装在Python中的,无需单独安装。 第二步:安装requests模块 接口自动化测试需要使用requests模块来发送HTTP请求、获取响应等操作,因此需要安装requests模块。使用pip安装requests命令如下: pip install requests 第三步:编写测试用例 使用unittest框架编写测试用例,首先需要导入unittest库并创建测试类,编写测试方法,方法名必须以test开头,并使用assert断言方法进行验证。例如: import unittest import requests class TestApi(unittest.TestCase): def test_get_users(self): url = 'http://localhost:8080/api/users' res = requests.get(url) self.assertEqual(res.status_code, 200) self.assertIsNotNone(res.json()) 第四步:执行测试用例 使用unittest框架执行测试用例,使用unittest.main()方法运行所有测试用例。例如: if __name__ == '__main__': unittest.main() 执行测试用例后,将输出测试结果,包括测试用例总数、成功数、失败数等。 第五步:持续集成 持续集成可以帮助实现自动化测试,可以将上述步骤集成到自动化测试框架中,提高测试效率和质量。使用持续集成工具,例如Jenkins,可以实现自动化测试的调度和执行,定期输出测试报告,是测试自动化化的不二选择。 在以上步骤中,请求地址和验证方法需要根据具体需求进行更改,但是编写测试用例的方法是类似的,熟练掌握unittest库可以快速搭建接口自动化测试框架,提高测试效率和质量。 ### 回答2: Python unittest requests 接口自动化测试框架搭建教程博客是指一篇博客文章,介绍如何使用Python unittestrequests库搭建接口自动化测试框架。该教程博客有如下几个方面: 1. 简单介绍Python unittestrequests库,以及它们在接口自动化测试中的使用; 2. 详细讲解如何安装Python unittestrequests库,并编写测试用例; 3. 讲解如何通过使用Python unittest的setUp()和tearDown()方法,在测试用例执行前后进行一些操作,以便更好地进行测试; 4. 介绍如何运行测试用例,并查看测试结果,以及如何进行测试报告生成; 5. 提供一些实例,展示如何使用Python unittestrequests库搭建接口自动化测试框架。 通过这篇教程博客,读者可以学习如何使用Python unittestrequests库搭建接口自动化测试框架,并且能够快速了解并掌握这种接口自动化测试方法的流程和基本方法。此外,该教程博客也提供一些实例,帮助读者更好地理解和应用这种方法。因此,这篇教程博客对于想要学习接口自动化测试以及深入了解Python unittestrequests库的读者来说,是一篇非常有价值的文章。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多测师软件测试培训师肖sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值