首页 前端知识 接口自动化:python pytest jsonpath 参数化 Template xToolkit requests allure实现接口自动化核心代码并生成测试报告---关联接口

接口自动化:python pytest jsonpath 参数化 Template xToolkit requests allure实现接口自动化核心代码并生成测试报告---关联接口

2024-05-26 00:05:10 前端知识 前端哥 203 317 我要收藏

 一、构建思路

1.1测试用例化为接口数据存于Excel表格,请求的构建与发送用python代码实现,通过xToolkit来读取表格数据,将读取到的数据转化为列表格式(转化为列表),然后循环调用遍历发送请求。由于一般代码执行会遇到出现错误就停止的情况,引入pytest参数化机制,自动循环DDT。

二、构建测试数据

2.1根据请求具体内容,在Excel中构建如下表头数据 。如需使用xToolkit来读取表的数据,注意后缀最好为xls,且要注意使用的办公软件,xToolkit的支持者暂时只提供office2006的维护,所以要么直接一直用office2006,要么用office2006构建之后再用WPS进行修改,这样可以尽量避免不可读此表的报错。当然request不止这些参数,按需构建就行。如下是部分参数说明。(可以通过pycharm中写一个request方法,然后Ctrl+鼠标左键,查看此函数详细说明)

2.2表中数据需要按图示填写,因为request请求参数要么为None(不是NULL,也不是''),要么有值。

三、用xToolkit读取数据、pytest参数化构建request请求 

shurufazifusheet=0我用WPS打开之后就是这样,实际上软件显示这个表是sheet=1,大家要么的 填显示的,要么就跟列表一样下标从0开始。 

 @pytest.mark.parametrize 后一般接函数方法。

eval函数,会自动按照传参数据格式,格式化掉对应数据,例如:eval(空格空格{“age”:18}换行),eval会将括号内数据传化为标准JSON格式。因为Excel表格写入JSON等数据时,可能会用到空格或者换行,导致原文识别格式识别不准确,所以用eval。

request的常用四个参数都给值,有无参数都传值,实际上没有此参数的,传的是Excel填的none。

加上断言后试试效果: 如下图,断言结果与响应数据的text格式。

此段代码如下: 

import requests,pytest
from xToolkit import xfile

#1、读取目标Excel表格,并将其转化为列表
case_list = xfile.read("Book1.xls").excel_to_dict(sheet=0)

#2、eval按照填的数据格式,自动格式化数据,比如填的JSON格式,自动转化为JSON数据
#pytest参数化,自动循环执行
@pytest.mark.parametrize("case_dict",case_list)
#参数化后最好在下面定义一个方法
def test_case_excel(case_dict):
    res=requests.request(url= case_dict.get("接口URL"),
                     method=case_dict.get("请求方式"),
                     params=eval(case_dict.get("URL参数")),  # 字典/字节序列,作为参数增加到URL中
                     data=eval(case_dict.get("JSON参数"))
                    )

    assert res.status_code ==case_dict.get("预期状态码")
    print(res.text)

四、如何应对上个请求的响应结果里有这个请求需要的查询参数? (如token又称提取参数)

类似如下情况:

 接口1中响应参数有个token(提取参数),token也是接口2URL中的查询参数(需要参数)

构建顺序理解:1、提取全局变量修改部分URL 。2、发起请求。3、对将提取参数存入全局变量。

参数化内按照表格列顺序编写。

4.1新建一个文件用于存放对象,构建一个类,类中定义空字典,定义如下三个方法

#设置一个类,到时候实例化对象用来储存提取参数的值
class g_var(object):
    _globar_dict={}
#只能改变key的值,不能改key名
    def set_dict(self,key,value):
        self._globar_dict[key] = value
        # self._globar_dict.get(key) =value,get方法不可用于修改key值,所以会报错

    def get_dict_value(self,key):
        return self._globar_dict.get(key)

    def show_dict(self):
        return self._globar_dict

4.2完善请求前面的处理

from 放置构建的类的py文件 import g_var(类名)

from string import Template引入Template库,Template用法如下:

4.3完善请求后面的处理

jsonpath语法如下图:$..能读多层嵌套的json,由于使用jsonpath后会读取到很多相似的目标内容组成的数组,所以jsonpath读取要越精确越好,我们只取第0号元素,一般来说最精确。

五、全段代码 

5.1接口主代码

import pytest
from xToolkit import xfile
import requests
import jsonpath
from script.script.gobal_value import g_var
from string import Template
# python读取Excel库

#1、读取目标Excel表格,并将其转化为列表
case_list = xfile.read("Book1.xls").excel_to_dict(sheet=0)
print(case_list)
print("--------------")
print(case_list[0].get("用例编号"))

#2、eval按照填的数据格式,自动格式化数据,比如填的JSON格式,自动转化为JSON数据
#pytest参数化,自动循环执行
@pytest.mark.parametrize("case_dict",case_list)
def test_excel_case_(case_dict):
    #初始化/修改url值,通过存贮对象
    url = case_dict.get("接口URL")
    dict = g_var().show_dict()
    url_ = Template(url).substitute(dict)

    res = requests.request(url=url_,
                           method=case_dict.get("请求方式"),
                           params=eval(case_dict.get("URL参数")),     #字典/字节序列,作为参数增加到URL中
                           data=eval(case_dict.get("JSON参数"))       #字典/字节序列/文件对象,作为request的内容
                           )

    #修改dict/填入dict值,数据来源是提取参数(上个接口返回的token),提取参数来源就是case_dict
    if case_dict.get("提取参数") != None or case_dict["提取参数"] != '':
        list_ = jsonpath.jsonpath(res.json(), '$..'+case_dict.get("提取参数"))  #['token值']
        g_var().set_dict(case_dict.get("提取参数"), list_[0])

    assert res.status_code ==case_dict.get("预期状态码")

# if __name__ == '__main__':
#     pytest.main(['-vs','--capture=sys'])

5.2构建类的主代码

#设置一个类,到时候实例化对象用来储存提取参数的值
class g_var(object):
    _globar_dict={}
#只能改变key的值,不能改key名
    def set_dict(self,key,value):
        self._globar_dict[key] = value
        # self._globar_dict.get(key) =value,get方法不可用于修改key值,所以会报错

    def get_dict_value(self,key):
        return self._globar_dict.get(key)

    def show_dict(self):
        return self._globar_dict

六、接上如下代码利用allure生成测试报告(allure要安装好必备软件包和在线模板):

6.1无法生成报告及生成报告为0和NaN%的解决方案:

如果确认代码没问题,但一直没有新的文件夹(如allure-results)生成:修改python设置中Testing默认的pytest ,改成Unittests ,再次运行__main__,报告即可生成。

6.2找到放置测试报告的目录下的index.html,用浏览器打开即可

if __name__ =='__main__':
    pytest.main(['-s','-v','-q','--capture=sys','Test_ExcelCase.py','--clean-alluredir','--alluredir=allure-results'])
    os.system(r"allure generate -c -o 测试报告")

转载请注明出处或者链接地址:https://www.qianduange.cn//article/9574.html
评论
发布的文章

JQuery中的load()、$

2024-05-10 08:05:15

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!