Pytest测试框架
- 日志模块: pytest.ini 配置日志, requests封装logging模块可以实现
- 通知机器人: 钉钉获取webhook链接, jenkins安装dingtalk插件, 配置webhook
- 其他特性- 钩子函数: 应用场景**
pytest_terminal_summary
**实现测试结果收集 - 辅助函数, 环境变量: fixture函数
命令行参数
代码语言:javascript
复制# -x
python -m pytest # 全部执行
python -m pytest -x # 1次失败停止
python -m pytest --maxfail 2 # 2次失败停止
# -k
python -m pytest -k 'Login and not ft' # 执行Login相关的测试用例, 单不执行带有ft的
# -q
python -m pytest -q # 控制条输出简化信息
# -v
python -m pytest -v # 控制台输出详细信息
# 指定路径执行
python -m pytest .testcasestrina_uniontest_m2.py::Test1::test_m1
# -m
python -m pytest -m pre #只执行带有pre标记的
# --lf
python -m pytest --lf # 只运行上次失败的用例
# -n
python -m pytest -n 5 # 多线程执行, 依赖pytest-xdist
# --reruns
python -m pytest --reruns 2 # 失败重试, 依赖pytest-rerunfailures
# -s
python -m putest -s # 显示print打印内容
# --pdb
python -m pytest --pdb # 用例失败进入pdb模式, 可查看变量
# --html
python -m pytest .testcases --html ./reports/report.html # 生成html测试报告(静态简陋)
# --alluredir
pytest testcases --alluredir=./reports" # 生成allure报告
Setup_teardown
代码语言:javascript
复制# 函数级别的初始化和收尾
class Test1:
def teardown_method(self):
logging.info("TearDown----")
def setup_method(self):
logging.info('Test1---setup_method')
# 类级别的初始化和收尾
class Test1:
def setup_class():
logging.info("setup_class----")
def teardown_class():
logging.info("teardown_class------")
# 模块级别的初始化和收尾
def setup_module():
logging.info("setup_module----")
def teardown_module():
logging.info("teardown_module------")
fixture
- 设置在conftest.py或者测试用例文件中
- 用于setip, teardown及返回测试数据
代码语言:javascript
复制# scope: 影响层级
# autouse: 自动生效,无需测试用例引用
@pytest.fixture(scope='function', autouse=True)
def f1():
logging.info("------fixture setup-------")
yield 'fixture'
logging.info("------fixture teardown-------")
class Test1:
def test_m2(self, f1):
logging.info(f1) # 通过fixture函数名获取 yield返回值 'fixture'
@pytest.mark.usefixtures('f2') # 引用fixture的方式2
def test_m1(self):
logging.info('Exe-----testm2')
assert 1==1
# params: 数据驱动, 循环返回列表数据
@pytest.fixture(params=[1,2,3])
def fp(request):
yield request.param
class Test2:
def test_m1(self, fp):
logging.info(fp) # 执行三次, 分别获取到 1, 2, 3
装饰器
代码语言:javascript
复制# 数据驱动parametrize
class Test1:
@pytest.mark.parametrize("v1, v2",
[
(1, 9),
(2, 8),
(3, 7)
])
def test_m2(self, f1, v1, v2):
logging.info(f1)
logging.info(f"v1:{v1},v2:{v2}")
assert 1==1
# 跳过 skip
@pytest.mark.skip(reason='for test')
def test_m1(self):
logging.info('Exe-----testm2')
assert 1==1
# 条件跳过skipif
@pytest.mark.skipif(condition='check_db(1)')
def test_m1(self):
logging.info('Exe-----test_m1')
# mark: 用例标记
@pytest.mark.pre
class Test2:
def test_m1(self):
logging.info('Exe-----test_m1')
# xfail 预期失败用例