Pytest测试框架核心功能与实战指南
本文详细介绍Python测试框架Pytest的核心特性与使用方法。涵盖从基础编写规则、命令行运行到高级功能如参数化测试、测试顺序控制、HTML报告生成及多进程并行执行。通过具体代码示例,解析pytest-selenium、pytest-html等插件集成,帮助开发者高效构建自动化测试体系。
Pytest框架概述与核心特性
Pytest介绍
Pytest是一个功能完备且成熟的Python测试框架,具备以下显著特点:
1、语法简洁灵活,易于上手,且拥有丰富详细的官方文档;
2、支持参数化功能,允许对测试用例进行细粒度控制;
3、既适用于简单的单元测试,也能处理复杂的功能测试,同时可结合selenium/appnium进行自动化测试,或通过pytest+requests实现接口自动化;
4、拥有庞大的第三方插件生态,支持自定义扩展。
- 例如pytest-selenium(集成selenium浏览器自动化)、
- pytest-html(生成完美的HTML格式测试报告)、
- pytest-rerunfailures(支持失败用例重跑)、
- pytest-xdist(实现多CPU并行分发测试)、
- pytest-ordering(控制测试用例执行顺序)
5、支持对测试用例进行skip(跳过)和xfail(预期失败)处理;
6、能与CI/CD工具(如Jenkins)无缝集成,适应持续集成流程。
测试编写规范与基础运行
编写规则:
- 测试文件名必须以test_开头,或以_test结尾;
- 测试类名必须以Test开头,且该类不能包含__init__方法;
- 测试函数名必须以test_开头;
断言操作直接使用Python原生的assert语句即可。
快速示例
test_pyexample.py
import pytest
class TestClass:
def test_one(self):
x = "this"
assert 'h' in x
def test_two(self):
x = "hello"
assert hasattr(x, 'check')
def test_three(self):
a = "hello"
b = "hello world"
assert a in b
通过命令行运行:
1、进入代码所在目录,执行命令:py.test test_pyexample.py
2、安装pytest-sugar插件可获得进度条显示效果。
Pycharm配置运行:
1、依次点击File -> Settings -> Tools -> Python Integrated Tools -> 项目名称 -> Default test runner,选择py.test。
import pytest
class TestClass:
def test_one(self):
x = "this"
assert 'h' in x
def test_two(self):
x = "hello"
assert hasattr(x, 'check')
def test_three(self):
a = "hello"
b = "hello world"
assert a in b
if __name__ == "__main__":
pytest.main('-q test_class.py')
Console常用参数介绍:
- -v 用于显示每个测试函数的详细执行结果;
- -q 仅显示整体测试结果摘要;
- -s 用于显示测试函数中print()函数的输出内容;
- -x, --exitfirst 遇到第一个错误或失败测试时立即退出;
- -m 仅运行带有特定装饰器配置的测试用例;
- -h 显示帮助信息。
py.test # run all tests below current dir
py.test test_mod.py # run tests in module file test_mod.py
py.test somepath # run all tests below somepath like ./tests/
py.test -k stringexpr # only run tests with names that match the
# the "string expression", e.g. "MyClass and not method"
# will select TestMyClass.test_something
# but not TestMyClass.test_method_simple
py.test test_mod.py::test_func # only run tests that match the "node ID",
# e.g "test_mod.py::test_func" will be selected
# only run test_func in test_mod.py
参数化测试与顺序控制
pytest参数化
使用装饰器:@pytest.mark.parametrize()实现参数化测试。
单个参数:
import pytest
import random
@pytest.mark.parametrize('x',[(1),(2),(6)])
def test_add(x):
print(x)
assert x==random.randrange(1,7)
多个参数:
import pytest
@pytest.mark.parametrize('x,y',[
(1+2,3),
(2-0,1),
(6*2,12),
(10*2,3),
("test","test"),
])
def test_add(x,y): #必须与上面保持一致,只能用x,y不能用其他字母
assert x==y
控制测试运行顺序
安装pytest-ordering插件。
pip install pytest-ordering
借助装饰器@pytest.mark.run(order=1)来指定测试执行的顺序。
import pytest
import time
value=0
@pytest.mark.run(order=2) #后执行order=2
def test_add2():
print("I am 2")
time.sleep(2)
assert value==10
@pytest.mark.run(order=1) #先执行order=1
def test_add():
print("I am add")
global value
value=10
assert value==10
测试报告生成与覆盖率统计
运行后生成测试报告(htmlReport)
安装pytest-html插件:
pip install -U pytest-html
如何使用:
py.test test_pyexample.py --html=report.html
更详细的测试报告
安装 pytest-cov插件:
pip install pytest-cov
如何使用
py.test --cov-report=html --cov=./ test_code_target_dir
Console参数介绍
--cov=[path], measure coverage for filesystem path (multi-allowed), 指定被测试对象,用于计算测试覆盖率
--cov-report=type, type of report to generate: term, term-missing, annotate, html, xml (multi-allowed), 测试报告的类型
--cov-config=path, config file for coverage, default: .coveragerc, coverage配置文件
--no-cov-on-fail, do not report coverage if test run fails, default: False,如果测试失败,不生成测试报告
--cov-fail-under=MIN, Fail if the total coverage is less than MIN. 如果测试覆盖率低于MIN,则认为失败
多进程并行与失败重跑机制
多进程运行
安装pytest-xdist插件:
pip install -U pytest-xdist
如何使用:
py.test test_pyexample.py -n NUM
其中NUM填写并发的进程数。
重新运行失败的用例
安装pytest- rerunfailures插件:
import random
def add(x,y):
return x+y
def test_add():
random_value=random.randint(2,7)
print('random_value:'+str(random_value))
assert add(1,3)==random_value
如何使用:
命令:pytest --reruns 重试次数
比如:pytest --reruns 3 表示:运行失败的用例可以重新运行3次
命令:pytest --reruns 重试次数 --reruns-delay 次数之间的延时设置(单位:秒)
比如:pytest --reruns 3 --reruns-delay 5 表示:运行失败的用例可以重新运行3次,第一次和第二次的间隔时间为5秒钟
另外也可以通过装饰器的方式配置:
@pytest.mark.flaky(reruns=3, reruns_delay=5)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









