pytest 多个PY文件执行共享变量及用fixture和conftest
------------恢复内容开始------------
1.pytest需要测试多个py文件,这些文件有一定的依赖关系,同时执行的时候,需要只执行一次初始化setup,结束再执行一次teardown;
2.多个py文件需要使用pytest的conftest.py,这个文件名是固定的,在同级目录还需要__init__.py;
3.由于setup这种经典的初始化方法只支持module,class.method,function,setup
module: 一个py文件只运行一次,里面可以是class和function;
class: 每个class执行一次;
method: class里面的每个函数执行一次;
function : 每个函数执行一次(函数不在class中);
setup: 最小层级,每个函数运行一次;在allure报告中,现在在Test body中;其他级别显示在的setup中;
4.经典初始化不支持多个py初始化,只能选用fixture;
scope值 :默认是function;
session 多个py文件;
module 一个py文件里面多个class或function;
class: class级别;
function:函数级别;
由于我们是多个py所以,只能选择session;
yield 是setup和teardown分界线;
@pytest.fixture(scope="session")
def start_up_session():
try: case_name = os.path.basename(__file__).replace('.py', '')
print(case_name + " start")
# yield 前面的是tearup的操作
yield case_name
# yield 后面的是teardown的操作
print(case_name + " finish")
autouse = True fixture里面有个参数autouse,默认是Fasle没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了;
@pytest.fixture(scope="function", autouse=True)
def get_status():
case_name = os.path.basename(os.path.abspath(__file__)).replace(".py", "")
print(case_name + " begin")
yield 1 if case_name.isalnum() else 0
print(case_name + " finish")
# 不传参数get_tstus也会运行
def test_1():
print(1111) def test_name():
print(2222) if __name__ == "__mian__":
pytest.main(["-s", "test_base.py"])
=========================================
============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-5.4.2, py-1.8.1, pluggy-0.13.1 -- C:\Program Files\Python36\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.8', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.2', 'py': '1.8.1', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.13', 'cov': '2.8.1', 'forked': '1.1.3', 'html': '2.1.1', 'metadata': '1.9.0', 'ordering': '0.6', 'rerunfailures': '9.0', 'timeout': '1.3.4', 'xdist': '1.32.0'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: F:\ShenjuCloudTest\APP
plugins: allure-pytest-2.8.13, cov-2.8.1, forked-1.1.3, html-2.1.1, metadata-1.9.0, ordering-0.6, rerunfailures-9.0, timeout-1.3.4, xdist-1.32.0
collecting ... collected 2 items test_base.py::test_1 test_base begin
PASSED [ 50%]1111
test_base finish test_base.py::test_name test_base begin
PASSED [100%]2222
test_base finish ============================== 2 passed in 0.03s ============================== Process finished with exit code 0
autouse = True fixture里面有个参数autouse,默认是Fasle没开启的,需要显示调用;
import pytest
import os # 默认autouse=Fasle
@pytest.fixture(scope="function")
def get_status():
case_name = os.path.basename(os.path.abspath(__file__)).replace(".py", "")
print(case_name + " begin")
yield 1 if case_name.isalnum() else 0
print(case_name + " finish") # 显式调用
@pytest.mark.usefixtures("get_status")
def test_1():
print(1111) # 显式调用
@pytest.mark.usefixtures("get_status")
def test_name():
print(2222) if __name__ == "__mian__":
pytest.main(["-s", "test_base.py"])
5.fixture 需要返回值:用传参数调用:在函数参数中,插入fixture的参数;
import pytest
import os @pytest.fixture(scope="function", autouse=True)
def get_status():
case_name = os.path.basename(os.path.abspath(__file__)).replace(".py", "")
print(case_name + " begin")
yield 1 if case_name.isalnum() else 0
print(case_name + " finish") def test_1(get_status):
num = get_status
assert num == 0
print(1111) def test_name(get_status):
num = get_status
assert num < 1
print(2222) if __name__ == "__mian__":
pytest.main(["-s", "test_base.py"])
=================================== ============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-5.4.2, py-1.8.1, pluggy-0.13.1 -- C:\Program Files\Python36\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.8', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.2', 'py': '1.8.1', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.13', 'cov': '2.8.1', 'forked': '1.1.3', 'html': '2.1.1', 'metadata': '1.9.0', 'ordering': '0.6', 'rerunfailures': '9.0', 'timeout': '1.3.4', 'xdist': '1.32.0'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: F:\ShenjuCloudTest\APP
plugins: allure-pytest-2.8.13, cov-2.8.1, forked-1.1.3, html-2.1.1, metadata-1.9.0, ordering-0.6, rerunfailures-9.0, timeout-1.3.4, xdist-1.32.0
collecting ... collected 2 items test_base.py::test_1 test_base begin
PASSED [ 50%]1111
test_base finish test_base.py::test_name test_base begin
PASSED [100%]2222
test_base finish
6.fixture 不需要返回值:除了用传参数调用,还可以用@pytest.mark.usefixtures();对class和函数都可以使用,记得和scope搭配;
import pytest
import os @pytest.fixture(scope="function", autouse=True)
def get_status():
case_name = os.path.basename(os.path.abspath(__file__)).replace(".py", "")
print(case_name + " begin")
yield 1 if case_name.isalnum() else 0
print(case_name + " finish") @pytest.mark.usefixtures("get_status")
def test_1():
print(1111) @pytest.mark.usefixtures("get_status")
def test_name():
print(2222) if __name__ == "__mian__":
pytest.main(["-s", "test_base.py"])
=======================================
============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-5.4.2, py-1.8.1, pluggy-0.13.1 -- C:\Program Files\Python36\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.8', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.2', 'py': '1.8.1', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.13', 'cov': '2.8.1', 'forked': '1.1.3', 'html': '2.1.1', 'metadata': '1.9.0', 'ordering': '0.6', 'rerunfailures': '9.0', 'timeout': '1.3.4', 'xdist': '1.32.0'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: F:\ShenjuCloudTest\APP
plugins: allure-pytest-2.8.13, cov-2.8.1, forked-1.1.3, html-2.1.1, metadata-1.9.0, ordering-0.6, rerunfailures-9.0, timeout-1.3.4, xdist-1.32.0
collecting ... collected 2 items test_base.py::test_1 test_base begin
PASSED [ 50%]1111
test_base finish test_base.py::test_name test_base begin
PASSED [100%]2222
test_base finish
7. 多个py文件使用conftest.py,名字固定,不要改;
同级需要有__init__.py;
千万不要通过import导入conftest,否则每个py文件都会运行一遍conftest.py, 无法起到多个py只执行一次作用;pytest执行的时候自动去读conftest.py配置;
import pytest
import os # conftest.py @pytest.fixture(scope="session")
def get_status():
case_name = os.path.basename(os.path.abspath(__file__)).replace(".py", "")
print(case_name + " begin")
yield 1 if case_name.isalnum() else 0
print(case_name + " finish")
import pytest
import os # test_base @pytest.mark.usefixtures("get_status")
def test_1():
print(1111) @pytest.mark.usefixtures("get_status")
def test_name():
print(2222) if __name__ == "__mian__":
pytest.main(["-s", "test_base.py"])
====================================================================
============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-5.4.2, py-1.8.1, pluggy-0.13.1 -- C:\Program Files\Python36\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.8', 'Platform': 'Windows-10-10.0.18362-SP0', 'Packages': {'pytest': '5.4.2', 'py': '1.8.1', 'pluggy': '0.13.1'}, 'Plugins': {'allure-pytest': '2.8.13', 'cov': '2.8.1', 'forked': '1.1.3', 'html': '2.1.1', 'metadata': '1.9.0', 'ordering': '0.6', 'rerunfailures': '9.0', 'timeout': '1.3.4', 'xdist': '1.32.0'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_202'}
rootdir: F:\ShenjuCloudTest\APP
plugins: allure-pytest-2.8.13, cov-2.8.1, forked-1.1.3, html-2.1.1, metadata-1.9.0, ordering-0.6, rerunfailures-9.0, timeout-1.3.4, xdist-1.32.0
collecting ... collected 2 items
test/test_base.py::test_1 conftest begin
PASSED [ 50%]1111
test/test_base.py::test_name PASSED [100%]2222
conftest finish
============================== 2 passed in 0.03s ==============================
Process finished with exit code 0
------------恢复内容结束------------
pytest 多个PY文件执行共享变量及用fixture和conftest的更多相关文章
- pytest文档2-用例执行
用例设计原则 1.文件名以test_******.py文件和*******_test.py 2.以test_****开头的函数 3.以Test***开头的类 4.以test_*****开头的方法 5. ...
- Pytest fixture及conftest详解
前言 fixture是在测试函数运行前后,由pytest执行的外壳函数.fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集.配置测试前系统的初始状态.为批量测试提供数据源等 ...
- pytest:conftest.py文件
一.fixture scope 为session 级别是可以跨 .py模块调用的,也就是当我们有多个 .py文件的用例时,如果多个用例只需调用一次fixture,可以将scope='session', ...
- 『德不孤』Pytest框架 — 14、Pytest中的conftest.py文件
目录 1.conftest.py文件介绍 2.conftest.py的注意事项 3.conftest.py的使用 4.不同位置conftest.py文件的优先级 5.conftest.py中Fixtu ...
- 【linux】终端直接执行py文件,不需要python命令
先将终端所在路径切换到python脚本文件的目录下然后给脚本文件运行权限,一般755就OK,如果完全是自己的私人电脑,也不做服务器什么的,给777的权限问题也不大(具体权限含义参考chmod指令的介绍 ...
- python顺序执行多个py文件
python顺序执行多个py文件 假如我要执行code目录下的python程序,假设该目录下有1.py,2.py,3.py,4.py四个文件,但是我想执行1.py,2.py,4.py,则可在该目录下创 ...
- jenkins+pytest+ allure运行多个py文件测试用例
jenkins的pytest运行多个py文件,导出allure报告方法,只需改下job的配置中的构建即可(pytest会运行指定文件下的所有test开头的py文件),如下: ...
- selenium,unittest——自动化执行多个py文件脚本并生成报告
将多个py文件的自动化脚本顺序运行,并生成报告,运行run_all_case后会自动运行文件内所有test开头的py文件并在指定文件夹report生成由脚本时间命名的报告 脚本执行后结果: 生成报告并 ...
- 整合多个py文件接口的unittest。suite执行方法
1.每个接口用例为一个.py文件.内容如下: getAdMakeMoneyList文件: # coding=utf-8import xlrdimport requestsimport unittest ...
随机推荐
- 14.1 Go数据结构
14.1 Go数据结构 每一个程序都在学习十八般武艺,学习语言.数据库.HTTP等技能. 而程序中的九阳神功就是数据结构与算,掌握了数据结构与算法,你的内功修炼就会有质的飞跃. 无论从事业务开发,测评 ...
- 高效、可维护、组件化的CSS
如何写出更加高效的CSS? 主要有以下四个关键点: 高效的CSS 可维护的CSS 组件化的CSS hack-free CSS 1.书写高效的CSS代码 * 使用 外联样式 替代行间 样式或者内嵌样式. ...
- Spring 依赖注入(DI)简介
依赖注入的英文表示为dependency injection,缩写为DI. Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系. 当编写一个复杂的 Java 应用程序时, ...
- Istio-架构
读书笔记整理 工作机制:分为控制面和数据面 控制面:Pilot, Mixer(接收来自Envoy上报的数据), Citadel(证书和密钥管理) 数据面:Envoy 工作流程: 自动注入 应用程序启动 ...
- python基础:list与string互转
数据清洗必备技能 https://www.cnblogs.com/yaner2018/p/11162630.html
- centos 7 firewalld防火墙配置
1.查看firewall服务状态 systemctl status firewalld 2.查看firewall的状态 firewall-cmd --state 3.开启.重启.关闭.firewall ...
- react中路由不起作用的奇怪现象
同样的两段Router代码,为什么一段正常,一段不起作用(也没有任何错误log提示) 瞪着眼观察也看不出为什么... 通过选中高亮显示内容相同, 为何就是有一段路由不管用呢? 折腾半天发现... 大小 ...
- 北京理工大学复试上机--2001A
1.编写程序,计算下列分段函数 y=f(x)的值. y = -x + 2.5, 0 <= x < 2 y = 2 - 1.5 (x - 3) (x - 3), 2 <= x < ...
- jchdl - GSL实例:FullAdder
https://mp.weixin.qq.com/s/CtT08xZON0YxnheqDM2FAw 全加器是能够计算低位进位的二进制加法电路.与半加器相比,全加器不只考虑本位计算结果是否有进位,也考虑 ...
- jchdl - RTL实例 - MOS6502 Mem
https://mp.weixin.qq.com/s/ST8q-VWOT47kcYg10-4AQw 实现一个简单的内存模块,匹配MOS6502 CPU使用. 参考链接 https://gith ...