赞
踩
在命令行中,通过执行
pytest -h
或pytest --help
命令,用户可以访问pytest
的详尽帮助文档。这个帮助文档是一个快速且有效的资源,用于了解
pytest
的使用方法、它所提供的各种功能和命令行选项。这个帮助文档不仅列出了所有可用的命令行选项及其描述,还提供了关于如何编写和组织测试代码的实用指导。
用户可以通过文档了解如何编写有效的测试函数、如何组织测试文件的结构、如何使用断言来验证测试结果,以及如何利用fixtures来管理测试中的共享资源。
此外,帮助文档还可能包括有关参数化测试、编写插件、集成第三方库、配置
pytest
行为的高级主题,以及如何在持续集成/持续部署**(CI/CD)**环境中使用pytest
的指南。
注意:虽然命令多的吓人,但是常规工作中根本用不到
- 环境配置选项:设置
pytest
的环境配置,如设置日志级别、覆盖配置文件、设置测试模式等。- 测试过滤选项:过滤和选择测试用例,如指定测试目录、选择特定测试模块、运行指定测试函数等。
- 测试执行选项:控制
pytest
的测试执行过程,如重试失败测试、生成测试报告、并行执行测试等。注意:命令允许组合使用,如下所示
# pytest.main([测试信息输出, 指定测试用例, 测试报告输出, 测试失败次数])
pytest.main(["-q", "test_login.py", '--html=./report.html', "-x"])
- –version:打印
pytest
的版本号。- -h,–help:显示
pytest
的命令行选项和使用说明。- -v,–verbose:增加输出的详细程度,可以多次使用以获取更详细的输出。
- -q,–quiet:减少输出的详细程度,可以多次使用以获取更简洁的输出。
- –traceconfig:显示解析和加载配置文件时的详细信息。
- –pdb:启用调试器,当测试失败时,会自动进入 Python 调试器。
- –pdbcls=CLASSNAME:使用自定义的调试器类。
- –capture:设置
pytest
的标准输出流捕获方式,有三个选项:no
不捕获、stdout
仅捕获标准输出、stderr
仅捕获标准错误、sys
捕获两者。- –norecursedirs=dir1 dir2 …:指定不需要递归搜索的目录列表。
- –rootdir=PATH:指定
pytest
的根目录,通常是包含pytest.ini
配置文件的目录。
- path:指定要运行的测试文件或目录的路径。可以是相对路径或绝对路径。
- -m <marker_expression>:仅运行带有指定标记的测试用例
- -k <expression>:根据表达式选择测试用例。表达式可以是字符串、正则表达式或布尔表达式
- –lf,–last-first:首先运行上次测试失败的测试用例。
- –ff,–failed-first:首先运行上次失败的测试用例,并在所有测试结束后再次运行这些失败的测试用例。
- –sw:仅重新运行上次修改过的测试模块。
- –last-failed-no-failures:如果上次运行中有失败的测试用例,则仅运行这些失败的测试用例;否则,不执行任何测试。
- –collect-only:仅收集测试用例而不执行它们。这可以用于检查测试收集阶段的行为。
- –trace:显示
pytest
的内部跟踪信息。- –count n:限制要运行的测试用例数量不超过
n
。
- -n,–numprocesses=n:指定要并行运行的进程数。这对于在多个CPU核心上并行执行测试很有用
- -x,–exitfirst:在第一个失败的测试用例后立即退出测试执行。
- –maxfail=n:设定在第
n
次测试失败后停止测试执行。- –reruns=n:在测试用例失败时重新运行
n
次。- –tb=STYLE:设置错误跟踪信息的显示格式,其中STYLE可以是
long
、short
、line
、native
或no
。- –show-capture=ITEM:控制是否显示捕获的输出,ITEM可以是
all
、failed
或no
。- –disable-warnings:禁用pytest的警告信息输出
- –junit-xml=PATH:生成
JUnit XML
格式的测试报告。
# 设置pytest的执行参数 "-q":安静模式, 不输出环境信息
pytest.main(["-q"])
# 设置pytest的执行参数 "-s":显示程序中的print/logging输出
pytest.main(["-s"])
# 设置pytest的执行参数 "-v":丰富信息模式, 输出更详细的用例执行信息
pytest.main(["-v"])
执行全部用例
# 直接执行pytest.main():自动查找当前目录下,以`test_`开头或者以`_test`结尾的 .py 文件
pytest.main()
执行指定py文件的用例
# main函数中填写py文件,会运行指定文件内的测试任务;
pytest.main(["test_login.py"])
执行指定方法的测试用例
# main函数中填写 `py文件::类::方法` (例如:test_mod.py::TestClass::test_method)
# 会运行指定文件内的、指定类的、指定测试任务;
pytest.main(["test_login.py::Test_Login::test_login"])
执行被标记的测试任务
# 设置pytest的执行参数 "-m slow":会执行被装饰器 `@pytest.mark.marker` 装饰的所有测试用例;
# @pytest.mark.marker中,`marker` 字符名称可以自定义;例如定义为 `level1`
@pytest.mark.level1
def test_a(self):
pass
pytest.main(['-m=level1'])
allure 测试报告输出,详细使用方法见后续篇章
# 需要安装 allure-pytest
# 设置pytest的执行参数 "--alluredir=./report"
## --alluredir : 生成报告类型
## ./report : 生成报告存放路径及名称
pytest.main(['--alluredir=./report'])
html 静态报告
# 需要安装 pytest-html
# 设置pytest的执行参数"--html=./report.html":执行测试文件并生成html格式的报告
## --html : 生成报告类型
## ./report.html : 生成报告存放路径,及报告名称
pytest.main(['--html=./report.html'])
# '--self-contained-html':将html的css样式合并到测试报告中
pytest.main(['--html=./report.html' , '--self-contained-html'])
xml 格式报告(没用过)
# 设置pytest的执行参数 "--junitxml=./report.xml":执行测试文件并生成xml格式的报告;
# 可以与jenkins做集成时使用
## --junitxml : 生成报告类型
## ./report.xml : 生成报告存放路径,及报告名称
pytest.main(["--junitxml=./report.xml"])
log 格式报告(没用过)
# 设置pytest的执行参数 "--resultlog=./report.txt":执行测试文件并生成log格式的报告(4.0以上版本被移除)
## --resultlog : 生成报告类型
## ./report.txt : 生成报告存放路径,及报告名称
pytest.main(["--resultlog=./report.txt"])
注意:输出测试报告的时候,如果允许的测试用例文件不在根目录下,可能会生成失败
可以在
根目录
编写一个main.py
专门用来启动测试
失败 1 次停止测试
# 设置pytest的执行参数 -x":第01次失败就停止测试
pytest.main(["-x"])
指定最大失败次数后,停止测试
# 设置pytest的执行参数 "--maxfail=2":第02次失败就停止测试
pytest.main(["--maxfail=2"])
指定失败重试次数后,停止测试
# 需要安装 pytest-rerunfailures
# 设置pytest的执行参数 "--reruns=NUM"(NUM是重试次数):测试用例运行失败时,重新运行用例
pytest.main(["--reruns=2"])
指定用例并发进程数
# 需要安装 pytest-xdist
# 设置pytest的执行参数 "-n NUM"(NUM是需要并发的进程数):支持多线程运行测试用例
pytest.main(["-n=2"])
测试文件命名规则:
- 测试文件通常以
test_
开头或者以_test
结尾;- 例如
test_example.py
或example_test.py
。- 另外,Pytest 还会查找以
test_
开头或者以_test
结尾的目录,并在这些目录及其子目录中查找测试文件。测试类命名规则:
- 测试类必须以
Test
开头,并且不能带有__init__
方法(因为它是类的构造函数,不是测试方法)。- 测试类通常应该继承自
unittest.TestCase
或其他测试基类,但这并不是强制性的。测试函数命名规则:
- 测试函数通常以
test_
开头或者以_test
结尾- 例如
test_function()
或function_test()
。- 测试函数通常不能带有任何参数(除了
self
,如果它是一个类的方法)
规则 | 描述 | 示例 |
---|---|---|
基本规则 | 默认行为 | 不提供任何参数时,pytest 在当前目录及其子目录中查找以 test_ 开头或以 _test 结尾的 Python 文件,以及这些文件中的以 test_ 开头的函数和类方法。 |
通过路径指定 | 指定目录 | pytest some_directory/ |
通过文件名指定 | 指定文件 | pytest test_example.py |
通过表达式指定 | 按关键字匹配 | pytest -k "test_something" |
通过节点指定 | 指定函数 | pytest test_example.py::test_function |
指定类 | pytest test_example.py::TestClass | |
指定类方法 | pytest test_example.py::TestClass::test_method | |
使用通配符 | 模糊匹配文件名 | pytest test_*.py 匹配所有以 test_ 开头的文件 |
结合目录和通配符 | 在指定目录下模糊匹配文件名 | pytest some_directory/test_*.py |
排除文件或目录 | 使用 --ignore | pytest --ignore some_directory/ignore_this_dir/ |
指定测试根目录 | 使用 --rootdir | pytest --rootdir=/path/to/root/dir |
按文件结构查找 | 使用 -p 或 --pyargs | pytest -p package.module |
指定Python解释器 | 使用 --pythonpath | pytest --pythonpath=/path/to/python/lib |
其他选项 | 如 -v(详细输出)、-q(简洁输出)等 | pytest -v (详细输出) |
test_case_01.py
文件代码
import pytest def addition(x, y): return x + y def test_01_a(): print("正在执行 test_a 函数...") assert addition(3, 5) == 8 class TestClassCase01: def test_01_b(self): assert "a" in "apple" def test_01_c(self): assert "a" in "apple" if __name__ == '__main__': pytest.main()
test_case_02.py
文件代码
class TestCase01:
def test_02_a(self):
print("正在执行 test_02_a 函数...")
def test_02_b(self):
print("正在执行 test_02_b 函数...")
pytest
等价于:
python -m pytest
和pytest ./
命令
暂略
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。