pyTest执行Excel用例生成Allure报告
1. Pytest框架环境搭建
# 首先使用pip安装pytest
pip install pytest
pip install pytest-html #原生态报告模版
# 查看 pytest 是否安装成功
pip show pytest
使用pytest执行测试需要遵行的规则:
py测试文件必须以test
开头(或者以_test
结尾);
测试类必须以Test
开头,并且不能
有init
方法;
测试方法必须以test_
开头
断言必须使用assert
2. 数据驱动(主要集中在test_case包中的test_login文件中)直接上代码:
项目整体结构如下:
- config文件配置:
HOST = "https://**********"; #请求地址
- loginCase.yml文件代码:
# 注释 登录接口
- #test_01用例
detail: 账号与密码都正确
data: #请求体
username: "superadmin"
password: "111111"
type: 2
resp:
code: 200
message: "操作成功!"
- #test_01用例
detail: 账号与密码都正确
data: #请求体
username: "superadmin"
password: "1111111"
type: 2
resp:
code: 200
message: "操作成功!"
- login.index:
from config.index import HOST;
import requests;
import hashlib;
# md5加密方法处理
def get_md5(psw):
md5 = hashlib.md5();
md5.update(psw.encode("utf-8"));
return md5.hexdigest();
# 登录接口模块封装
class Login:
def login(self,params):
url = f"{HOST}/login";
resq = requests.post(url,json=params);
return resq.json()
if(__name__ == "__main__"):
res = Login().login({"username":"superadmin","password":"111111","type":2});
print(res)
- text_case.text_login:
# 文件名必须以test开头 test_login
import pytest;
import allure,os
from tools.yamlContpl import get_yaml_data;
from login.index import Login
# 接上集讲的登录接口 - 测试类封装
# 测试类必须以`Test`开头
class TestLogin():
# params response 为参数
# get_yaml_data("../data/loginCase.yml") 对应着两个参数
# get_yaml_data("../data/loginCase.yml") 值为
# [(
# {'username': 'superadmin', 'password': '111111', 'type': 2},
# {'code': 200, 'message': '操作成功!'}
# )]
# 数组中有多少个元组就以为着会运行 下面那个方法多少字 元组的每一项和前面的参数一一对应
# 详细说明 {'username': 'superadmin', 'password': '111111', 'type': 2} 对应着参数 params
# 详细说明 {'code': 200, 'message': '操作成功!'} 对应着参数 response
# 那么就是说params是调用login方法的参数
@pytest.mark.parametrize("params,response",get_yaml_data("../data/loginCase.yml")) #数据驱动方法 这个方法后面千万别加分号
def test_login(self,params,response):
print(params)
res = Login().login(params);
# 拿请求到的数据 res中的message 和 希望得到的数据 response中的message 进行对比
assert res["message"] == response["message"];
# 运行测试用例 test_001
if (__name__ == "__main__"):
# 运行test_login.py文件 --alluredir 输出报告 路径为 ../eport/tmp
pytest.main(["test_login.py","-s","--alluredir","../report/tmp"]); # -s 打印输出 不加-s 不会有输出
# 浏览器中开启一个服务 将输入日志打印出来
os.system("allure serve ../report/tmp")
# 调用后,控制台输出:
# F 为用例失败
# E error 失败
# . 成功
- tools.yamlContpl.py
#读取yml文件需要安装 pyYaml库
import yaml;
def get_yaml_data(fileDir):
# 打开文件
fo = open(fileDir,"r",encoding="utf-8");
# 读取其中全部内容
res = yaml.load(fo,Loader=yaml.FullLoader);
fo.close();
# 对数据进行处理 处理为数组元组 为pytest框架做准备
# 将请求参数和希望值放到一个元组当中
# 将元组放入list数组挡住
list = []
for i in res:
list.append((i["data"],i["resp"]))
return list
if(__name__ == "__main__"):
res = get_yaml_data("../data/loginCase.yml");
print(res)
上面的代码就将多个测试用例利用框架一次性实现,那么我们想要导出响应的报告就需要Allure来进行一起去做
3. Pytest结合Allure执行测试
安装allure
mac 安装:brew install allure
window安装:下载allure.zip 将解压后的bin路径添加环境变量
验证allure是否安装成功allure
安装allure-pytest
:pip install allure-pytest
allure生成报告的原理:
1 .生成报告所需的文件
2.使用一些工具打开可视化报告
那么该如何实现呢. 将test_case.test_login.py文件中的代码修改为如下所示?
# 文件名必须以test开头 test_login
import pytest;
import allure,os
from tools.yamlContpl import get_yaml_data;
from login.index import Login
# 接上集讲的登录接口 - 测试类封装
# 测试类必须以`Test`开头
class TestLogin():
# params response 为参数
# get_yaml_data("../data/loginCase.yml") 对应着两个参数
# get_yaml_data("../data/loginCase.yml") 值为
# [(
# {'username': 'superadmin', 'password': '111111', 'type': 2},
# {'code': 200, 'message': '操作成功!'}
# )]
# 数组中有多少个元组就以为着会运行 下面那个方法多少字 元组的每一项和前面的参数一一对应
# 详细说明 {'username': 'superadmin', 'password': '111111', 'type': 2} 对应着参数 params
# 详细说明 {'code': 200, 'message': '操作成功!'} 对应着参数 response
# 那么就是说params是调用login方法的参数
@pytest.mark.parametrize("params,response",get_yaml_data("../data/loginCase.yml")) #数据驱动方法 这个方法后面千万别加分号
def test_login(self,params,response):
print(params)
res = Login().login(params);
# 拿请求到的数据 res中的message 和 希望得到的数据 response中的message 进行对比
assert res["message"] == response["message"];
# 运行测试用例 test_001
if (__name__ == "__main__"):
# 运行test_login.py文件 --alluredir 输出报告 路径为 ../eport/tmp
pytest.main(["test_login.py","-s","--alluredir","../report/tmp"]); # -s 打印输出 不加-s 不会有输出
# 浏览器中开启一个服务 将输入日志打印出来
os.system("allure serve ../report/tmp")
# 调用后,控制台输出:
# F 为用例失败
# E error 失败
# . 成功
当我们想要在自动化执行前、执行后执行一些操作 我们应该怎么去做操作呢?
在运行用例的pakage下新建名为conftest.py
的文件,名称不能更改,代码如下:
import pytest;
@pytest.fixture(scope="session",autouse=True)
def start_running():
print("自动化测试开始前1111");
yield
print("自动化测试结束")
在print
中自由操作,做自己想做的事
python的一些基本操作,从爬虫、游戏、抓包、自动化到目前为止就有了一个大概的认知,那么接下来使用python去专研哪个方向,就交给大家咯。花一段时间去深入的学习一下我自己的老本行,一个月左右回来,带着大家一起去走进运维的世界,那个世界是真的美好!!!