一、pytest 安装
官方文档:https://docs.pytest.org/en/latest/
1. pytest安装
pip install pytest -U -i https://pypi.tuna.tsinghua.edu.cn/simple
# 常用插件
1. html 报告插件
pip install pytest-html
使用方法:pytest --html=report.html
2. 分布式运行
pip install pytest-xdist
使用方法:
pytest -n 2 (2代表2个CPU)
pytest -n auto
3.失败重跑插件
pip install pytest-rerunfailures
使用方法:
1. 指定单个用例:@pytest.mark.flaky(reruns = 5 ,reruns-delay = 1 )
2. 命令行运行:pytest test_demo.py --reruns 5 --reruns-delay 1 -vs
4.allure报告
pip install allure-pytes
注意:allure win上需要单独下载安装
5.执行顺序插件
pip install pytest-ordering
使用方法 : @pytest.mark.run(order=2)
6.多重校验
pip install pytest-assume
使用方法:pytest.assume(1==3)
7. 用例依赖
pip install pytest-dependency
使用方法:
@pytest.mark.dependency()对所依赖的方法进行标记
@pytest.mark.dependency(depends=["test_name"])引用依赖,test_name可以是多个
二、pytest 用例识别规范
- 测试用例所有的包中必须有__init__.py
- 测试模块以 test_ 开头(或者 _test 结尾也可以) 【下划线不能少】
- 测试函数以 test 开头
- 测试类以 Test 开头 【大写 T 开头,并且不能带有 init 构造方法】
- 测试类中的方法以 test 开头
三、运行方式
3.1 命令行运行
pytest -v -s --maxfail=3 --reruns=3 -n=3
pytest -v -s --maxfail=3 --reruns=3 --reruns-delaey=3 -n=3
3.2 在代码中运行
pytest.main(["-v", "-s", '--reruns=3','-n=2'])
3.3 常用参数
1. -s 输出 print 信息
2. -q 简略输出
3. -v 显示更详细的信息,也可 -vv -vvv
4. 通过节点格式 模块路径名::类名/函数名::方法名 来指定测试用例的执行
5. -k 指定 关键字执行,支持and or not 逻辑运算符,可以匹配文件名、函数名、类名、方法名
1. -k login:只会找用例节点信息中包含login关键字的用例并执行
2. -k login and baidu:只会去找项目中用例节点信息中包含 login 关键字且包含 baidu 关键字的用例执行
3. -k login or baidu:找用例节点包含login'或者baidu关键字的用例并执行
4. -k not login :找项目节点中找用例节点信息中不包含login 关键字的用例并执行
6. -m 通过模块执行用例
1. 先需要在【配置文件】中定义 项目的模块名
1. markers = 模块名:模块注释
2. 声明用例所属模块,在用例上方使用 @pytest.mark.模块名
3. 执行对应模块用例
1. -m 模块名 :执行该项目中指定模块用例,同时支持 and or not 逻辑运算符
2. -m login and user:执行既是login也是user的模块
3. -m login or user:执行login或者user的模块
4. -m not login:执行非login的模块
7. -n=线程数:多线程执行,需要安装 pip install pytest-xdist
8. --reruns=重跑次数 :失败重跑n次,需要安装 pip install pytest-rerunfailures
1. 如果直接写在参数中,表示对所有用例都生效
2. 在用例上面 @pytest.mark.flaky(reruns=重跑次数)
9. --count=重复执行次数 ,重复执行 ,需安装:pip install pytest-repeat
1. 直接写在参数中,表示针对所有用例重复执行
2. 在用例上方 @pytest.mark.repeat(次数) ,表示针对单个用例重复执行
10. -x :断言,失败即停止,遇到断言错误立马停止
11. --maxfail=最大失败个数,当失败的个数等于最大失败个数,则停止运行
12. 断言错误后继续运行用例后续的代码,pytest.assume(要断言的内容) ,需要安装install pytest-assume
四、断言
- assert 断言
- 语法: assert 断言,断言出错时的提示 【断言的结果是 True 或者 False】
- 方式:
1. assert a==b 判断 a 等于 b 2. assert a!=b 判断 a 不等于 b 3. assert a>=b 4. assert a<b 5. assert not (a>b) 6. assert hasattr(object,name) 【hasattr 有没有属性】 7. assert 1 in [1,2,3]
- 多重校验
语法:pytest.assume(1==3)
五、固件
- 固件:满足场景就会执行
- 常规固件,pytest已经定义实现好的固件,直接使用即可
5.1前后置操作
1. setup_class :类中所有用例执行前,执行一次(可以用它替代` __init__`操作),只会执行一次--->在类里面进行定义
2. teardown_class :类中所有用例执行后执行一次,只会执行一次。--->在类里面进行定义
3. setup:每个用例执行前执行一次,在类外面定义则指对类外面的函数生效,在类里面定义则只对类里面的方法生效
4. teardown:每个用例执行后执行一次,在类外面定义则指对类外面的函数生效,在类里面定义则只对类里面的方法生效
5. setup_function:每个函数执行前执行一次
6. teardown_function:每个函数执行后执行一次
7. setup_module:每个模块执行前执行一次。每一个py文件为一个模块
8. teardown_module:每个模块执行后执行一次。每一个py文件为一个模块
9. setup_method: 在类里面定义,每个方法执行前先执行
10. teardown_method:在类里面定义,每个方法执行后再执行
六、参数化
- 参数化:数据以参数的实行传入就叫做参数化
- 数据驱动:数据的个数决定 case 执行的次数,数据驱动用例的执行
- 实现:
- @pytest.mark.parametrize(argnames,argvalues)
- argnames:表示要接受的参数名称,建议直接个双引号,然后复制相应的参数即可
- argvalues:表示要传递给参数的值,可以用列表进行存放。
七、allure 报告
allure 是 java 写的一个报告生成工具,是一个独立工具,不依赖 pycharm python
- 安装:pip install allure-pytest
- 添加 allure 数据的配置,在pytest.ini 中添加参数 --alluredir=temp --clean-alluredir
- –alluredir :指定测试运行过程中数据的存放目录
- –clean-alluredir:每次运行前清空上一次的数据
- 使用:
- 一般在入口文件使用 os.system(终端命令)执行终端命令
os.system('allure generate ./temp -o ./report --clean')
八、配置文件
- 一般在项目文件的根目录下 定义一个 pytest.ini (固定命名方式,不能进行更改),如果文件里面包含中文注释,则只能使用 GBK 编码,
- 这个配置文件,帮着我们修改一些默认的配置
- 如果没有定义这个配置文件,pytest 会按照默认的方式去执行一些用例
[pytest]
# 配置pytest命令行运行参数
# 空格分隔,可添加多个命令行参数 -所有参数均为插件包的参数
addopts = -s
# 配置测试搜索的路径
# 当前目录下的testcase文件夹 -可自定义
testpaths = ./testcase
# 配置测试搜索的文件名
# 当前目录下的testcase文件夹下,以test_开头,以.py结尾的所有文件 -可自定义
python_files = test_*.py *_test.py
# 配置测试搜索的测试类名
# 当前目录下的testcase文件夹下,以test_开头,以.py结尾的所有文件中,以Test开头的类 -可自定义
python_classes = Test*
# 配置测试搜索的测试函数名
# 当前目录下的testcase文件夹下,以test开头,以.py结尾的所有文件中,以Test_开头的类内,以test_开头的方法 -可自定义
python_functions = test*
# 标记用例,-m可以进行选择执行
markers =
smoking: 冒烟
normal: 一般
九、fixture
- 作用:单独给用例添加前后置操作
def myfixture():
print('执行前要做的操作') #用例执行前要执行的代码
yield #一定要使用yield,yield后跟返回值,相当于函数中的return
print('执行后要做的操作') #用例执行后要执行的代码
-
在用例上方声明:
@pytest.mark.usefixtures('myfixture')
# myfixture 就是自己定义的函数名称 -
通过参数调用:def 用例方法(self,myfixture):#myfixture 就是自己定影的函数名称
-
一定要使用 yield,yield 后跟返回值,相当于函数中的 return
-
conftest.py 文件【文件名字不能修改】
- pytest 专门用来存放自定义固件的文件,可以将自己写的固件写在该文件中,其他模块中用例使用固件时不予要额外进行导入,一般该文件放在项目根目录,与 pytest.ini 同级。
-
fixture 参数化
- 语法在自定义配置文件中方法上使用
@pytest.fixture(params=[(a,b),(a,b)])
装饰器 - 必须 params 进行传参,参数最外层为列表,内层为可迭代对象,有几个可迭代的对象就运行几次
- 定义的固件,接受参数,必须使用 requset 形参
- 在函数内部必须使用 request.param 获取传递的参数,使用下标获取具体的值
- 语法在自定义配置文件中方法上使用
-
fixture 自动运行
- 语法:
@pytest.fixture(scope='function',aotuouse=True)
- “”"
"function"
(default), 默认为每个函数运行
"class"
, 每个类运行一次
"module"
, 每个模块运行一次
"package"
每个package运行一次
"session"
.“”" # 一次会话只运行一次
- 语法:
@pytest.fixture(scope='function',autouse=True)
def auto():
print('自动运行前')
yield
print('自动运行后')