一、pytest常见插件
是基于python 的单元测试框架
常见的插件:
pytest-html (生成简易的HTML报告) pytest-xdist(多线程执行)
pytest-ordering(修改测试用例的执行顺序)
pytest-rerunfailures (失败用例重跑)
pytest-base-url(管理基础路径:测试环境,开发环境,线上环境)
allure-pytest(生成allure报告)
作用:
1.发现用例(根据它默认的规则找到测试用例)
2.执行用例
3.判断结果
4.生成报告
二、pytest默认规则
1.模块名必须以test_开头或者_test结尾
2.测试类必须以Test开头,并且不能带有init(初始化)方法。
3.测试方法必须以test开头
三、pytest执行
1. 命令行执行
常用命令行:
pytest
pytest -vs #-s输出调试信息 -v输出详细信息
pytest -n=2 #指定多个线程执行
pytest --reruns=2 #失败用例重跑2次
pytest -x #出现一个失败用例就停止
pytest ---maxfail=2 #出现2个失败用例就停止
pytest --html=./reports/result.html #生成html报告
pytest -m "login" #指定执行login标记模块
pytest -m "login or product"
pytest --alluredir=./temps --clean-alluredir #指定allure报告生成临时文件位置
2. 主函数执行
import pytest
if __name__ == '__main__':
pytest.main(["-vs"])
3. 通过pytest.ini配置文件执行
不管是命令行执行还是主函数执行,都会自动化的去读取这个配置文件执行。
pytest.ini文件是pytest的全局配置文件,放到项目的跟路径。
如果pytest.ini文件中写了中文注释,那么就需要把编码格式改成GBK
[pytest]
#命令行参数
addopts= -v -s
#指定测试用例文件夹
testpaths= ./testcases
#修改默认模块规则
python_files=test_*.py
#改变默认的类规则
python_classes = Test*
#改变默认的用例规则
python_functions = test_*
#环境变量
base_url=
#用例标记分组
markers =
login:登陆模块
product_manager:商品管理
user_manager:用户管理
用例标记使用pytest.mark.名称
四、pytest.mark标记
pytest.mark.标记名
pytest.mark.run(order=1) #指定执行顺序
pytest.mark.skip() #跳过用例
pytest.mark.skip(reason="跳过")
pytest.mark.skipif(a<10,reason="跳过")
pytest.mark.usefixtures("sql") #类级别手动调用固件
pytest.mark.parametrize("变量名","测试数据") #实现数据驱动参数化
五、pytest前后置
def setup(self):
print("每个用例之前执行")
def teardown(self):
print("每个用例之后执行")
def setup_class(self):
print("类之前执行")
def setup_class(self):
print("类之后执行")
六、pytest的fixture固件
@pytest.fixture(scope="作用域",params="参数化",autouse="自动执行",ids="参数化时改变参数名称",name="别名")
scope:
function 函数,默认
class 类
module 模块
package/session 会话(通话),web项目中:从登陆到登出。
autouse
True 自动调用
False 手动调用
params:
参数化 传值通过request和request.param
1.function级别使用
1.1自动调用:
1.2手动调用:
2.class级别使用
2.1自动调用,加上后置处理:
2.1手动调用
3.module模块级别使用
一般都是自动调用,在当前模块有效
4.session会话级别使用
指定用例文件夹下的所有会话
5.conftest.py文件
固件放在conftest.py
下,名字固定。
放在根目录、用力下、模块内都能识别,作用域不一样。
执行顺序:从外层到内层执行,若在同一个conftest里,按照ASCII码顺序执行。
6.params参数化
7.ids
用于指定params参数的别名,必须和params一起使用
7.name
固件别名,使用别名后,手动调用固件时也只能用别名
七、pytest生成allure报告
1.安装allure-pytest
2.官网下载allure包 https://github.com/allure-framework/allure2/releases
配置环境变量:
3.生成临时json报告
addopts= -v -s --alluredir=./temps --clean-alluredir
–alluredir 指定临时报告的文件夹
-clean-alluredir 每执行一次自动清除原来的报告
4.生成html报告
import os
import time
import pytest
if __name__=='__main__':
pytest.main()
time.sleep(3)
os.system("allure generate ./temps -o ./reports --clean")
//files_name="./reports/report_"+str(int(time.time()))
// os.mkdir(files_name)
//time.sleep(3)
//os.system("allure generate ./temps -o "+files_name+" ./reports --clean")
-o output 输出
–clean 每执行一次自动清除原来的报告
八、allure定制
1.定制logo
定制logo图片和css样式,如下图所示:
2.定制项目名称
在每一个类上加@allure.epic("项目名称:项目1")
3.定制模块名称
在每个类上指定该类模块名@allure.feature("用户管理模块")
4.定制接口名称
在用例上添加@allure.story("登录接口")
5.定制用例名称
在用例上添加allure.title()
或者在用例里加上allure.dynamic.title("查询用例")
5.定制用例描述
在用例里加上allure.dynamic.description("查询用例用于实现验证查询是否成功")
或者用例上@allure.description("用例的描述1")
Description英文可以在类上添加描述修改
6.定制用例严重级别
BLOCKER致命,CRITICAL严重,NORMAL一般,MINOR提示,TRVIAL轻微
7.定制用例链接
@allure.link("接口访问的链接")
@allure.issue("bug链接")
@allure.testcase("测试用例链接")
8.定制用例步骤
9.定制用例附件
在用例里添加
with open("E:\\shu.jpg",mode="rb") as f:
allure.attach(body=f.read(), name="登陆错误截图",
attachment_type=allure.attachment_type.JPG)
10.局域网访问
allure open ./reports
九、pytest参数化
用例参数化有excel或yaml形式
1. YAML详解
yaml是一种数据类型,扩展名为.yaml或.yml
作用:
配置文件:环境变量、数据库信息、用户名密码、日志格式
测试用例:web、api、app
语法规则:
1.区分大小写
2.缩进表达层级,一般用空格
3.通过#注释
4.字符串可以不写引号,也可以写单引号或双引号。单引号会对特殊字符转义
常用数据类型:
1.标量(基本类型)
整形
浮点型
字符串
布尔型
null
日期时间
data1: 123
data2: 123.5
data3: True
data4: 码尚教育
data5: null
data6: 2022-4-20 20:25:30
data7: {"a": 1, "b": [1, 2, 3]}
2.对象(字典)
键:(空格)值
{键:(空格)值}
3.数组(列表),使用一组横线"-"开头的数据。
1 第一种:
2 - a
3 - b
4 - c
5 第二种:
6 ['a', 'b', 'c']
- data1: 123
- data2: 123.5
- data3: True
- data4: 码尚教育
- data5:
- a
- b
- c
- data6: 2022-4-20 20:25:30
- data7: {"a": 1, "b": [1, 2, 3]}
数据类型转换
- data1: !!int "123"
- data2: !!float "123"
- data3: !!str 123
- data4: !!bool true
- data5: !!null null
- data6: !!timestamp 2022-4-20
- data7: !!set {a,b,c}
- data8: !!seq [a,b,c]
- data9: !!map {"a":"b"}
- data10: !!binary E:/shu.jpg
引用
使用&设置锚点
使用*引用
将引用的字典合并到列表里使用<<:
2. YAML操作
1.下载插件
pip install pyyaml
2.读写操作
#读取yaml文件
def read_yaml(yaml_path):
with open(yaml_path,encoding="utf-8",mode="r") as f:
value=yaml.load(f,yaml.FullLoader)
//value=yaml.safe_load(f)
return value
#写入yaml文件
def write_yaml(yaml_path,data):
with open(yaml_path,encoding="utf-8",mode="w") as f:
value=yaml.dump(data,stream=f,allow_unicode=True)
#清空
def clear_yaml(yaml_path,data):
with open(yaml_path,encoding="utf-8",mode="w") as f:
f.truncate()
3. @pytest.mark.parametrize()结合YAML实现数据驱动
@pytest.mark.parametrize("变量名","数据")