Python+Requests+PyTest+Excel+Allure(二)接口自动化测试实战(附代码)

通过上一篇博客,我们已经把环境都装好了,开始写代码了

1 先用python 模拟请求:

     1.1 get请求

import requests

'''
URL Parameters 请求方式: URL参数
例如: 以get 方式请求http://httpbin.org/get?first_name=hello&last_name=word

'''

params={"first_name":"hello","last_name":"word"}
responds=requests.get("http://httpbin.org/get",params=params)
print(responds.text)
print(responds.url)

       1.2.1  post  请求         

import requests


params={"first_name":"hello","last_name":"word"}
headers={"Content-Tpye":"application/x-www-form-urlencoded"}
responds=requests.post("http://httpbin.org/post",data=params,headers=headers)
print(responds.text)
print(responds.url)
print(responds.request)

  1.2.2 post   json

import requests

'''
URL Parameters 请求方式: URL参数
例如: 以post 方式请求http://httpbin.org/get?first_name=hello&last_name=word

'''

params={"first_name":"hello","last_name":"word"}
headers={"Content-Tpye":"application/json"}
responds=requests.post("http://httpbin.org/post",json=params,headers=headers)
print(responds.text)
print(responds.url)
print(responds.request)

2 Pytest项目实战:

    2.1.依次创建子目录如下:

    base:存放一些最底层的方法封装,协议,请求发送等。common:存放一些公共方法。config:存放配置文件。data:存放测试数据。 log:存放日志。report:存放报告。tests:存放用例。utils:存放公共类。 readme:用于说明文档。requirements.txt: 用于记录所有依赖  包极其版本号,便于环境部署,可以通过pip命令自动生成和安装。

  

   2.2 封装请求方法(base目录下面创建method.py)

       2.2.1封装有两种方法:

       第一种:直接调用requests库下面的request方法,并将所有需要用到的参数定义进去,分为实参和行参,实参调用必须要传参,行参可给默认值,调用时可重新赋值也可以使用默认值。这种方法代码量少,不用做判断,request会自动根据传入的参数进行发送请求到服务器。

import requests
import json

class ApiRequest(object):

    #-----第一种请求方式封装request库,调用可根据实际情况传参
    def send_requests(self,method,url,data=None,params=None,headers=None,cookies=None,json=None,files=None,timeout=None):
        self.r=requests.request(method,url,data=data,params=params,headers=headers,cookies=cookies,json=json,files=files,timeout=timeout)
        return self.r
   

第二种:分别对各个请求方式按函数的形式封装,分别调用requests进行发送请求。以get和post为例:put,delete请求按一样方法封装,各个请求方式封装完成以后再定义一个主方法,直接调用主方法会自动根据请求方式进行判断调用各个请求函数,这里也可以不对请求方式汇总封装,直接调用各个函数进行发送请求也是可以的。这种方法封装涉及代码量较多,也没有能够很好的用上requests库,因此推荐使用第一种方法。

import requests
import json

class ApiRequest(object):

     def get(self,url,data=None,headers=None):
         if headers is not  None:
             res=requests.get(url=url,data=data,headers=headers)
         else:
             res=requests.get(url=url)
         return res.json()
    
     """POST请求"""
     def post(self,url,data,headers):
         if headers is not None:
             res=requests.post(url=url,data=data,headers=headers)
         else:
             res=requests.post(url=url,data=data)
         if str(res)=="<Response [200]>":
             return  res.json()
         else:
             return  res.text()
    
    
    
     """主方法"""
     def all_method(self,method,url,data=None,headers=None):
         if method=='get' or method=='GET':
             res=self.get(url,data,headers)
         elif method=='post' or method=='POST':
             res=self.post(url,data,headers)
         elif method=='put' or method=='PUT':
             res=self.post(url,data,headers)
         elif method=='delete' or method=='DELETE':
             res =self.delete(url,data,headers)
         else:
             res='请求方式不正确'
         return  json.dump(res,ensure_ascii=False,indent=4,sort_keys=True,separators=(',',':'))

2.2.2 封装读取文件的方法(common目录下创建public.py):

1、这里需要用到python的os库,os 库是Python标准库,包含几百个函数,常用的有路径操作、进程管理、环境参数等。

2、分别对获取目录和获取目录下文件进行了封装,直接调用并传入相应的参数即可使用。如下代码:

import  os
os.path.dirname(__file__)#获取当前目录
os.path.dirname(os.path.dirname(__file__))#获取当前目录的上一级

#获取指定的目录
def fileDir(data):
    """
    :param data: 目录
    :return: 返回
    """
    base_path=os.path.dirname(os.path.dirname(__file__))
    return os.path.join(base_path,data)#将获取到的目录返回
#获取路径下的文件,调用需要传递两个参数替换,否则使用默认的参数
def filePath(fileDir="data",fileName="data.xls"):
    """
    :param fileDir:目录
    :param fileName: 文件名称
    :return: 返回
    """
    return os.path.join(os.path.dirname(os.path.dirname(__file__)),fileDir,fileName)

2.2.3、准备数据(data目录下创建data.xlsx)

 将接口写入excel表,将接口需要用到的字段都写进excel然后直接进行读取。

2.2.4 封装读取文件方法(utils目录下面创建operationExcel.py)

定义一个文件类分别再定义一个方法获取Sheet表,定义一个方法获取出所有数据存放进列表 和对表头定义全局变量

#!/usr/bin/python 
# -*- coding: utf-8 -*-
#读取Excel表数据
import xlrd
import xlwt
from common import public
class OperationExcel:


    #获取shell表
    def getSheet(self):

        book = xlrd.open_workbook(public.filePath()) #前面已经默认将文件参数传递进去了,所以直接调用不用再传参了

        return book.sheet_by_index(0)  #根据索引获取到sheet表


    #以列表形式读取出所有数据
    def getExceldatas(self):
        data = []
        title=self.getSheet().row_values(0)  #0获取第一行也就是表头
        for row in range(1,self.getSheet().nrows): #从第二行开始获取
            row_value=self.getSheet().row_values(row)
            data.append(dict(zip(title,row_value)))  #将读取出每一条用例作为一个字典存放进列表
        return data

class ExcelVarles:
    case_Id="用例Id"
    case_module="用例模块"
    case_name="用例名称"
    case_url="用例地址"
    case_method="请求方式"
    case_type="请求类型"
    case_data="请求参数"
    case_headers="请求头"
    case_preposition="前置条件"
    case_isRun="是否执行"
    case_code="状态码"
    case_result="期望结果"
# hc = OperationExcel()
# print(hc.getExceldatas())


 2.2.5  封装登录方法(common目录下面创建login.py)

获取token提供给接口使用,使用@pytest.fixture装饰器每次执行所有用例前执行一遍登录方法获取到token并返回。

import pytest
# import requests
# import json
@pytest.fixture(scope='session')
#@pytest.fixture装饰器整个模块运行前运行一次里面的方法
def token():
    # """"获取token并返回"""
    # url="xxxx"
    # headers={...}  #请求头信息
    # data={...}  #请求参数
    # r=requests.post(url=url,data=json.dumps(data),headers=headers)
    # #返回所有token信息
    # token=str('Bearer' + r.json()['data']['access_token'])
    token = '23423525252'
    print(token)
    return token

2.2.6、封装用例(tests目录下面创建test_gwyc_api_all.py)

需要用到@pytest.mark.parametrize()装饰器进行封装用例,调用getExceldatas()将读取出来的用例存放进装饰器,"data"为别名。如下图,分别请求头和参数做了为空判断,并将token插入到headers里面,这样每一个接口都能使用到登录返回的token,不用每次都去调用获取token。

import  pytest
import json
from base import method
from utils import operationExcel
#参数化运行所有用例
@pytest.mark.parametrize('data',operationExcel.OperationExcel().getExceldatas())#装饰器进行封装用例
def test_gwyc_api(data):
    # 对请求头作为空处理并添加token
    headers=data[operationExcel.ExcelVarles.case_headers]
    if len(str(headers).split())== 0:
        pass
    elif len(str(headers))>= 0:
        headers=json.loads(headers)#转换为字典
#        headers['Authorization']=company_login_token#获取登录返回的token并添加到读取出来的headers里面
        headers=headers

    #对请求参数做为空处理
    params=data[operationExcel.ExcelVarles.case_data]
    if len(str(params).split())== 0:
        pass
    elif len(str(params))>= 0:
        params=params

    #断言封装

    case_code=str(data[operationExcel.ExcelVarles.case_code])
    def case_result_assert(r):
        assert  r.json()['errcode']==case_code#状态码
        assert data[operationExcel.ExcelVarles.case_result] in json.dumps(r.json(),ensure_ascii=False)#响应数据

    #执行用例
    if data[operationExcel.ExcelVarles.case_method]=='get':
        r=method.ApiRequest().send_requests(
            method='get',
            url=data[operationExcel.ExcelVarles.case_url],
            data=params,
            headers=headers
        )
        #print (r.json())
        case_result_assert(r=r)
    elif data[operationExcel.ExcelVarles.case_method]=='post':
        r = method.ApiRequest().send_requests(
            method='post',
            url=data[operationExcel.ExcelVarles.case_url],
            json=json.loads(params),
            headers=headers)
        # writeContent(r.json()['data']['access_tonken'])#提取出返回数据中想要的变量写入到文件中供其他接口使用
        print (r.json())
        case_result_assert(r=r)

if __name__ == '__main__':
    """执行并生成allure测试报告"""
    pytest.main(["-s","-v","--alluredir","./report/result"]) #运行输出并在report/result目录下生成json文件
    import subprocess #通过标准库中的subprocess包来fork一个子进程,并进行一个外部的程序
    subprocess.call('allure generate report/result/ -o report/html --clean',shell=True)#读取json文件并生成html报告,
                         # --clean若目录存在则先清除
    subprocess.call('allure open -h 127.0.0.1 -p 9999 ./report/html',shell=True)#生成一个本地的服务并自动打开html报告

2.2.7 、利用allure生成测试报告。

allure是Pytest的插件包需要下载安装,并将allure里面的bin目录所在的路径配置到PATH环境变量中就可以直接使用报告。

将生成的json文件存放到用例所在的目录下面执行完成以后会在tests目录下面生成一个report目录,下面包含result目录和html目录,前者是存放json文件,后者存放读取后生成的html报告

 

2.2.8 封装日志方法和发邮件(log目录下面创建log.py)

日志在自动化测试中起到的参考作用相对较小以测试报告为准,直接按相应规则配置好直接调用即可。

import yagmail
from loguru import logger

# 邮箱正文
contents = ['T的涩涩的得瑟的 here is just text http://somedomain/image.png',
 'You can find an audio file attached.', '../tests/report/html/index.html']
#链接邮箱服务器
yag = yagmail.SMTP( user="XXXXX@126.com", password="XXXXXXX", host='smtp.126.com')
# 发送邮件
yag.send('gao14@126.com', '圣诞祝福', 'sddsds')
logger.add('../log/mail.log')#加这个就会吧日志写到文件中
logger.info("test test test")

具体代码详见:链接   Python+Requests+PyTest+Excel+Allure+sendMail_pytestallure使用方法-Python文档类资源-优快云下载

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fish_study_csdn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值