pytest中的关联参数化日志及测试报告

Posted 咸鱼落成

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest中的关联参数化日志及测试报告相关的知识,希望对你有一定的参考价值。

一、关联

 利用Python提供的fixture可以实现关联

1、实现步骤:

 1.1、在case目录下,新建conftest.py文件,比如我们需要token,就在这个文件下定义一个公共的方法,调用登录接口并返回需要的token值(注:公共的方法一般不传入参数,返回值其实也是看情况可要可不要的)

@pytest.fixture(scope=\'function\')   #使用pytest的fixture把下面的方法变成公共方法

 1.2、在需要使用的测试案例中,传入方法名,在需要用到关联的参数时,直接使用

 

 

 2、面试题:接口与接口之间的关联是怎么处理的?

答:框架使用的是Python的fixture,定义一个公共的方法,通过去引用这个人方法名字的方式,来自动调用这个公共的方法,并且获得需要的返回值,例如token,以此来解决关联的问题

二、pytest中数据和脚本分离(即实现参数化过程)

1、什么时候需要参数化

实际项目中,接口地址,请求头,请求参数等,这些都称为数据,一般来说,需要将数据单独存放,例如放在数据文件里

参数化一般用于相同接口不同参数的使用,比如登录接口,有登录成功和登录失败

2、pytest参数化:

pytest的参数化主要有两种方式,第一种是使用pytest的parametrize实现参数化;第二种是使用数据文件

2.2.1、使用parametrize实现参数化

pytest参数化----parametrize理解:第一个参数是字符串,表示要给test_data()方法哪一个参数,即他俩是一样的,第二个参数给一个可序列的数据类型(即元组和数组),最后test_data()方法分别取序列的值执行

 运行结果如下:

由此可以发现,现在的测试用例变成了四条,即可序列化元组(1,2,3,4)的长度,并且这时候的datas就是元组中的每个数据

2.2.1.1、使用parametrize编写第一个接口:

 以此类推,可以编写多个接口

2.2.1.2、使用parametrize编写6个接口:

2.2.1.3、优化

 优化,还可以在每个测试案例前,加上接口名称,如下:

2.2.2、使用数据文件实现参数化

2.2.2.1、数据文件准备

可以用txt、excle、yaml等文件,存放数据,初学者推荐excle,比较直观

以下以excle文件为例:一般会有id、title、url、headers、method、data、http_code、msg几栏,注意sheet

 

2.2.2.2、在data文件夹里存放数据文件

选中data文件夹,右键----在文件资源管理器中显示,将刚才的excle文件粘贴到data目录下

   

 由此,在vscode中,data文件夹下,就有个测试数据文件

在vscode中安装office viewer,就可以直接在vscode查看excle文件(注意安装后需要重启vscode),后续也可以直接在vscode里进行编辑

   

2.2.2.3、取数据

这就会涉及到Python中读取excle的知识,需要用到Python中的第三方包xlrd

①安装xlrd包:pip3 install xlrd==1.2.0(指定版本)

 ②在vscode的utils中导入含文件读写方法的py文件

 注:vscode中复制绝对路径和相对路径:

 Python读取excle代码:

import xlrd
def read_excel(excel_path, sheet_name, skip_first=True):    
    results = []
    datas = xlrd.open_workbook(excel_path)  # 打开excel获取excel的操作对象
    table = datas.sheet_by_name(sheet_name) # 根据sheetname打开具体的页面
    # start_row = 1 if skip_first is True else 0
    if skip_first is True:      # skip_first为true:从第二行取
        start_row = 1
    else:
        start_row = 0
        
    # 循环读取excel
    for row in range(start_row, table.nrows):   # [1,2,3,4,5,6]
        results.append(table.row_values(row))        
    return results

# [
#     [行1],
#     [行2],
#     [行3]...
# ]
# 防止其他文件导入exceltools时执行这些代码,测试代码
if __name__ == "__main__":
    a = read_excel(r\'D:\\小可爱\\code\\RCtest\\data\\人才管理系统.xlsx\', "首页")
    print(len(a), type(a))
    for i in a :
        print(i)

2.2.2.4、在编写测试用例的py文件中里导入exceltools

代码如下:

import os,sys
sys.path.append(os.getcwd())
from utils.exceltools import read_excel

2.2.2.5、编写测试用例

 首先,要特别注意读取excle返回的结果如下,是字符串类型的数据,需要eval一下,尤其注意token的值:\'"token":"user_login"\',可以发现,如果在excle数据文件中,如果直接写成"token":user_login,那Python读取出来后,就会变成\'"token":user_login\',直接eval以下就能变成需要的字典格式,所以这里直接在vscode里修改一下

 vscode中修改数据文件:

 再次打印Python读取的excle文件,返回如下:

 编写测试用例:

 至此,实现了参数化的测试案例编写。

2.2.2.6、优化

观察可以发现,目前我们写的所有的测试案例,都是post方法的,一旦在excle表格中填写了其他类型的方法,那测试案例就会报错,因此,二次封装request方法很有必要(放在utils中)。

 

 

 ①封装代码如下:

import requests


def http_request(url="", method="post", headers=, json=):
    if method == "post":
        return requests.post(url=url, headers=headers, json=json)
    elif method == "get":
        return requests.get(url=url, headers=headers, json=json)
    else:
        return False

②在测试案例中导入封装的方法:

import os,sys
sys.path.append(os.getcwd())
from utils.httprequest import http_request

③修改原测试案例(method参数之前就传了-----先见之明):

三、pytest框架中的日志(用于记录完整的执行流程)

1、新建log文件夹

一个日志应该包含当前运行的所有的信息,例如在请求一个方法之后,我们需要看到请求地址是什么,参数是什么,返回是什么等等

2、在哪里记录日志?

一般在请求的方法那记录,即封装的request方法那

3、怎么记录日志?

引入Python的第三方包loguru :pip3 install loguru -i https://pypi.tuna.tsinghua.edu.cn/simple

4、具体使用

3.4.1、导入loguru包中的logger方法:

from loguru import logger

注:日志主要分为普通日志,报警日志和报错日志,如下所示:

 

 

3.4.2、将请求地址、参数和返回结果记录在日志里:

   #接口地址及请求参数
    logger.info("接口地址:".format((url)))
    logger.info("接口方法:".format((method)))
    logger.info("接口参数:".format((headers)))
    logger.info("接口请求头:".format((json)))
    #接口返回
    logger.info("返回值:".format(res.text))    

3.4.3、将日志保存在log文件夹下

代码如下:

logger.add("./log/lin.out",encoding="utf-8")   #将日志记录在当前文件夹下的log文件加下的lin.out文件中,再次运行后log文件夹下会自动生成一个这样的日志文件

 四、测试报告

进行自动化测试后,需要网页自动产生测试结果,可以用Python的第三方包allure

1、环境配置:

①java环境

②安装allure-commandline工具并配置环境变量

安装包安装,解压allure-commandline到任意文件夹下

复制该工具的bin目录,并添加到系统及用户变量的path下(保险起见系统及用户变量都添加)

  

 

③验证环境

验证allure-commandline是否安装成功:新建cmd,输入命令:allure

 

 

 

 

 2、安装allure-pytest的第三方包:pip3 install allure-pytest -i https://pypi.tuna.tsinghua.edu.cn/simple

 3、重启vscode,让allure-pytest生效

4、所有的测试用例开发完成后,在vscode终端执行pytest命令:pytest --alluredir=result(会自动创建一个result的文件夹)

5、将测试结果编译成测试报告

在vscode终端输入命令:allure generate result -o report --clean(含义:将result中的测试结果编译并生成测试报告且存放于report文件夹下,并且清除刚才的测试结果,report文件夹也会自动生成)

 

 

 

 

 

 

 6、打开测试报告,在VSCOder终端中输入命令:allure open report(输入命令并执行成功后,会自动跳转网页)

 

 

自动跳转网页(可修改为中文显示):

 

 

 注意:如果没有自动跳转网页,可以复制尖括号内的网址用谷歌浏览器打开,可能会存在兼容性的问题

 

以上是关于pytest中的关联参数化日志及测试报告的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 pytest 参数化函数名称

pytest文档39-参数化(parametrize)结合allure.title()生成不同标题报告

pytest「conftestpytest参数化重运行出测试报告」

Python测试框架pytest(28)测试报告Allure - 动态生成标题动态生成功能报告添加用例失败截图

pytest接口自动化测试框架 | pytest参数化

Pytest之参数化