python+requesets+ddt+unittest

接口自动化python+requests+ddt+unittest

接口自动化讲解:

新建一项目:命名:python_ddt_requests

首先我们先新建7个包:

1、conf包是用来组建接口请求的
	conf.ini文件里面写入要运行的系统基本信息和登陆账号密码
2、data包用来存放测试用例表格的
	 在wandwos系统中新建一个表格,表格内写入id、接口名称、用例标题,、用例类型、url、要填写的信息、预期结果、是否通过空置。然后将表格导入项目包中的data包内。
3、library包存放外部导入的工具函数

4、report包存放最终的测试报告
5.run_allcase包执行所有的用例并生成报告用的,
6、testcase包在里面运行编写的测试用例(需要拿到ddt这个工具函数)
	test_login模块
7.utils包存放所有自己写的封装语句
	head_path模块在里面编写项目与包的路径。
	head_conf模块在里面编写处理ini文件的代码。
	head_requests模块在里面写入封装接口的工具类。
	head_excel模块在里面写入读取表格的代码,使用pip3 install openpyxl下载。

首先在conf包下新建一个ini文件,命名 cms_conf.ini

ini 文件的格式(节点 下面:键=值) 节点就是:section 键值:option

[env] #节点 section
url=http://cms.duoceshi.cn
headers={'Content-Type': "application/x-www-form-urlencoded"}

utils文件中就是要讲整个项目包的路径进行整理:

handle_path 将需要的路径都写在这个文件中

import os
'''
os.path.dirname(__file__): 这行代码的作用是获取当前文件(即执行该代码的文件)的目录。__file__ 是一个内置变量,它表示当前文件的路径。os.path.dirname() 是一个函数,它将路径解析为目录。
os.path.dirname(os.path.dirname(__file__)): 这行代码的作用是获取上一步返回的目录的父目录。即,它获取当前文件所在的目录的父目录。
'''

#项目路径
xm_path=os.path.dirname(os.path.dirname(__file__))
#data路径
data_path=os.path.join(xm_path,"data") #os.path.join是 Python 的一个内置函数,用于连接路径
#conf路径
conf_path=os.path.join(xm_path,"conf")
#library路径
library_path=os.path.join(xm_path,"library")
#report路径
report_path=os.path.join(xm_path,"report")
#testcase路径
testcase_path=os.path.join(xm_path,"testcase")
#在utils 包下新建handle_conf.py 文件
#在读取ini 文件要用到ConfigParser 模块 pip  install  ConfigParser
from configparser import ConfigParser
from utils.handle_path import *

'''
 定义了一个名为Handle_conf的新类,它继承自ConfigParser类。
 这意味着Handle_conf类将具有ConfigParser类的所有功能和属性。
 当前这个类是用来处理conf.ini文件的工具类
'''
class Handle_Conf(ConfigParser):

    def __init__(self,filename):
        super(Handle_Conf,self).__init__()#继承父类的构造方法
        self.filename=filename#把传进来的形式参数赋值给到实例变量self.filename
        self.read(self.filename)#打开ini文件进行读取

    # 获取ini文件中的section下面对应的option的value值
    def get_value(self, section, option,):
        value=self.get(section,option)
        return value

path=os.path.join(conf_path,"conf_cms.ini")#读取的文件路径
conf=Handle_Conf(path)#创建对象读取ini
#print(conf.get_value('env','url'))  #调试下查看的 url
#print(conf.get_value('env','headers')) #调试下查看的 headers

将接口用例编写 存放在 data 包中 ,以xlsx文件格式

点击data包右键,new ,show in explorer 显示data路径,在路径中新建一个data.xlsx 文件

img

img

一个接口一个sheet页面,一条正确的用例,多条异常用例

img

注意点:在执行的过程一定要关闭xlsx文档

然后在新建utils 包下得 handle_excel.py 包,用来它用于读取和写入Excel电子表格

我们要运用openpyxl 这个库首先下载 openpyxl模块如下:

from utils.handle_path import *
import os
import openpyxl
'''
pip install openpyxl    下载openpyxl库
此模块是用来读取表格的工具类
'''
'''封装一个班读取Excel表格的工具类'''
class Handle_Excel(object):

    def __init__(self,filename,sheet_name):
        self.filename=filename#把传进来的形式参数赋值给到实例变量self.filename
        self.sheet_name=sheet_name

    '''封装一个打开Excel表格的工具方法'''
    def open(self):
        # 通过openpyxl模块调用load_workbook函数打开filename文件
        self.wb=openpyxl.load_workbook(self.filename)
        # 通过self.wb这个Excel文件的对象读取对应的sheet页面的
        self.sh=self.wb[self.sheet_name]

    '''封装了一个读取Excel表格的工具方法'''
    def read_data(self):
        self.open()#打开Excel表格
        # 获取表格中的每一行的数据放在元组当中
        datas=list(self.sh.rows)#把每一行的元素数据放在list列表当中
        # print(datas)
        title = [i.value for i in datas[0]]  # 对这个datas进行for循环遍历并且赋值给title这个变量
        # print(title)
        # 创建一个空列表,用来接收所有的测试用例
        cases=[]
        for j in datas[1:]:#对第2,3,4,5,6......行进行遍历
            # print(j)
            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 # 把所有的用例返回
    '''
    封装一个往Excel表格里面写入测试结果的工具方法
    '''
    def write_excel(self,row,column,value=None):

        self.open()# 打开表格
        self.sh.cell(row, column, value)# 往固定的row行和column列写入value数据
        self.wb.save(self.filename)# 保存数据

# if __name__ == '__main__':
#     path=os.path.join(data_path,"data.xlsx")
#     read_excel=Handle_Excel(path,"login")
#     read_excel.write_excel(2,8,"通过")

以上得操作都是数据准备工作,我们数据准备好了,就要组件接口调用方法

在utils中新建一个handle_requests.py文件

'''
此模块是用来封装发送接口请求的工具类
'''

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=url,params=params)
        elif method=="post":
            response=self.session.post(url=url,data=data,headers=headers)
        elif method=="post_json":
            response=self.session.post(url=url,json=json,headers=headers)
        elif method=="delete":
            response=self.session.delete(url=url,data=data)
        return response

接下来我们开始在testcase 下新建用例 以test 开始开头:

第一个用例文件名: test_login.py 登录接口



import unittest
from ddt import ddt,data
from utils.handle_excel import Handle_Excel
from utils.handle_path import *
import os
from utils.handle_conf import conf
from utils.handle_requests import Send_requests

'''
ddt模块
打开dos窗口:输入 pip install ddt  进行下载
ddt模块:是用来做数据驱动的
ddt装饰器:用来装饰类
data装饰器:用来装饰方法的
装饰器的原理:就是闭包,闭包就是函数里面定义一个函数,外面的函数称为外函数,里面的函数称为内函数
外函数中返回内函数的函数名,也就是返回内函数的地址,内函数里面写装饰器的逻辑
'''

case_file=os.path.join(data_path,"data.xlsx")

@ddt
class Test_Login(unittest.TestCase):
    excel=Handle_Excel(case_file,'login')
    cases=excel.read_data()#一个列表当中是5个字典,每个字典都是一个用例
    request=Send_requests() #创建了一个发送接口请求的对象

    @data(*cases)
    def test01_login(self,case):
        '''封装登录接口'''  # 数据要从Excel表格里面拿
        # 1.准备接口的入参
        url=conf.get_value("env","url")+case["url"]
        # eval() 函数是用来执行一个字符串表达式,并返回表达式的值
        headers = eval(conf.get_value('env', 'headers'))
        method=case["method"]
        data=eval(case["data"])
        excepted = eval(case["excepted"])
        case_id = case["case_id"]
        # case_id = case["case_id"] + 1  # 记录当前跑了几条用例
        # 2.发送接口请求
        response = self.request.send(method=method,url=url,data=data,headers=headers)
        result = response.json()
        print(result)
        # 3.对接口的响应内容进行断言
        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, "未通过")
            print(e)
        else:
            self.excel.write_excel(case_id, 8, "通过")
if __name__ == '__main__':
    unittest.main()

接下来在运行用例:run包下:

'''
此模块是用来生成测试报告,并且发送报告到邮箱`
'''
import time
import unittest
from library.HTMLTestRunnerNew import HTMLTestRunner
from utils.handle_path import *
from library.mail3 import SendMail

#定义生成报告的路径和文件
new = time.strftime('%Y-%m-%d-%H-%M-%S')
filename = report_path+'\\' + str(new)+"_api_report.html"
def auto_run():
    discover = unittest.defaultTestLoader.discover(
        start_dir=testcase_path,
        pattern='test_*.py')

    f = open(filename,'wb')
    runner = HTMLTestRunner(
        stream=f,
        title='cms平台接口自动化测试报告',
        description="用例执行情况如下",
        tester="dcs"
    )
    runner.run(discover)
    f.close()
def sendMail():
    sm = SendMail(send_msg=filename,attachment=filename)
    sm.send_mail()
if __name__ == '__main__':
    auto_run()
    sendMail()

在查看report 报告中是否生成报告

img

那我们接下来要写其他得用例,可以在testcase包中添加 test_updateloginpwd.py

#coding=utf-8

import unittest
from ddt import ddt,data
from utils.handle_excel import Handle_Excel
from utils.handle_path import *
import os
from utils.handle_conf import conf
from utils.handle_requests import Send_requests
from utils.handle_login import Cms_login
'''
ddt模块
打开dos窗口:输入 pip install ddt  进行下载
ddt模块:是用来做数据驱动的
ddt装饰器:用来装饰类
data装饰器:用来装饰方法的
装饰器的原理:就是闭包,闭包就是函数里面定义一个函数,外面的函数称为外函数,里面的函数称为内函数
外函数中返回内函数的函数名,也就是返回内函数的地址,内函数里面写装饰器的逻辑
'''
case_file = os.path.join(data_path,'data.xlsx')

@ddt
class Test_Login(unittest.TestCase):
    excel = Handle_Excel(case_file,'updateLoginPwd')
    cases = excel.read_data()  #一个列表当中是5个字典,每个字典都是一个用例
    # print(cases)
    request = Send_requests()  #创建了一个发送接口请求的对象
    @classmethod
    def setUpClass(cls) -> None:
        cls.request = Cms_login().login()  #调用登录接口
    @data(*cases)
    def test_02_updateLoginPwd(self,case):
        '''封装登录接口''' #数据要从Excel表格里面拿
        # 1.准备接口的入参
        url = conf.get_value('env','url')+case['url']
        # eval()  函数是用来执行一个字符串表达式,并返回表达式的值
        headers = eval(conf.get_value('env','headers'))
        method = case['method']
        data = eval(case['data'])
        excepted = eval(case['excepted'])
        case_id = case['case_id']
        case_id = case_id+1  #记录当前跑了几条用例

        # 2.发送接口请求
        response = self.request.send(method=method,url=url,data=data,headers=headers)
        result = response.json()
        # print(result)
        # 3.对接口的响应内容进行断言
        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,'未通过')
            print(e)
        else:
            self.excel.write_excel(case_id,8,'通过')
if __name__ == '__main__':
    unittest.main()

在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 = {"Content-Type":"application/x-www-form-urlencoded"}
        response = request.send(method='post',url=url,data=data,headers=headers)
        return request

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值