pytest学习记录之--使用命令行选项
一、使用命令行选项
可以使用 pytest --help 查看全部选项。
pytest --help
--collect-only 选项:
pytest --collect-only
使用--collect-only 选项可以展示在给定的配置下哪些测试用例会被运行。
借助该选项,可以非常方便的在测试运行之前,检查选中的测试用例是否符合预期。
-k 选项:
-k 选项允许你使用表达式指定希望运行的测试用例。
这个功能非常实用,如果某测试名是唯一的,或者多个测试名的前缀或后缀相同,那么可以使用表达式来快速定位。
可以结合 --collect-only 来验证筛选情况,如:
pytest -k "asdict or defaults" --collect-only
如果结果符合预期,则可以将 --collect-only 移除,让他们正常运行,如:
pytest -k "asdict or defaults"
-m 选项:
标记(marker)用于标记测试并分组,以便快速选中并运行。
使用什么标记名由你自己决定,假设你希望使用smoke,则可以使用@pytest.mark.smoke这样的装饰器来做标记。
import pytest ... @pytest.mark.smoke def test_xxx: ...
使用-m选项可以用表达式指定多个标记名。如:
- 使用 pytest -m "mark1 and mark2",可以同时选中带有这两个标记的所有测试用例;
- 使用 pytest -m "mark1 and not mark2",则会选中带有 mark1 的测试用例,二过滤掉带有 mark2 的测试用例;
- 使用 pytest -m "mark1 or mark2",则会选中带有 mark1 或者 mark2 的所有测试用例
-x 选项:
正常情况下,pytest会运行每一个搜索到的测试用例。
如果某个测试函数被断言失败,或者触发了外部异常,则该测试用例的运行就会到此为止,pytest将其标记为失败后会继续执行下一个测试用例。
通常,这就是我们期望的运行模式。
但是在debug时,我们会希望遇到事变时立即停止整个会话,这时 -x 选项就派上用场了。
pytest -x
使用 --tb=no 选项可以关闭错误信息回溯:
pytest --tb=no
--maxfail=num:
-x 选项的特点是,一旦遇到测试失败,就会全局停止。假设你运行pytest失败几次后再停止,则可以使用 --maxfail 选项,明确指定可以失败几次。如:
pytest --maxfail=2 --tb=no
-s 与 --capture=method:
-s 选项允许终端在测试运行时输出某些测试结果,包括任何符合标准的输出流信息。
-s 等价于 --capture=no
正常情况下,所有的测试输出都会被捕获。
测试失败时,为了帮助你理解究竟发生了什么,pytest会做出推断,并输出报告。
-st 和 --capture=no 选项关闭了输出捕获。
在编写测试用例时,可以添加几个print(),以便观察某时刻测试执行到哪个阶段。
使用 -l/--showlocals 选项,在测试失败时会打印出局部变量名和他们的值,这样可以规避一些不必要的print语句。
信息捕获的方法还有 --capture=fd 和 --capture=sys。
使用 --capture=sys 时,sys.stdout/stderr 将别输出到内存;
使用 --capture=fd 时,若文件描述符为1或2,将会被输出至临时文件中。
--lf(--last-failed)选项:
当一个或多个测试用例失败时,我们常常希望能够定位到最后一个失败的测试用例重新运行,这时可以使用 --lf 选项,如:
pytest --lf --tb=no
这里最好加上--tb选项,可以隐藏部分信息,或者指定其他的错误堆栈回溯模式,重新运行失败的测试用例。
--ff(--failed-first)选项:
--ff(--failed-first)选项与 --last-failed 选项的作用基本相同,不同之处在于 --ff 会运行完剩余的测试用例。如:
pytest --ff --tb=no
-v(--verbose)选项:
使用 -v/--verbose 选项,输出的信息会更详细。
最明显的区别就是每个测试文件中的每个测试用例占一行(先前是每个测试文件占一行),测试的名字和结果都会显示出来,而不仅仅是一个点或字符。如:
pytest -v --ff --tb=no
-q(--quiet)选项:
该选项的作用与-v/--verbose 的相反,它会简化输出信息。可以将 -q 和 --tb=line(仅打印异常的代码位置)搭配使用。
使用 -q 选项会简化输出信息,只保留最核心的内容。
-l(--showlocals)选项:
使用 -l 选项,失败测试用例由于被堆栈追踪,所以局部变量及其值都会显示出来。
--tb=style 选项:
--tb=style 选项决定捕捉到失败时输出信息的显示方式。
某个测试用例失败后,pytest会列举出失败信息,包括失败出现在哪一行、是什么失败、怎么失败的,此过程我们称之为“信息回溯”。
大多数情况下,回溯信息是必要的,它对找到问题很有帮助,但有时也会对多余信息感到厌烦,这时--tb=style 选项就有用武之地了。
推荐的style类型有:short、line、no。
使用 --tb=short 屏蔽全部回溯信息 short 模式仅输出 assert 一行以及系统判定内容(不显示上下文); 使用 --tb=line ,它可以告诉我们错误的位置 line 模式只使用一行输出显示所有的错误信息; 使用 --tb=no ,显示的回溯信息比前面两种的模式更详细 no 模式则直接屏蔽所有回溯信息;
在此之外,还有三种可选的模式:
- --tb=long 输出最为详细的回溯信息;
- --tb=auto 是默认值,如果有多个测试用例失败,仅打印第一个和最后一个用例的回溯信息(格式与long模式的一致);
- --tb=native 只输出Python标准库的回溯信息,不显示额外信息。
--duration=N 选项:
--duration=N 选项可以加快测试节奏。它不关心测试是如何运行的,只统计测试过程中哪几个阶段是最慢的(包括每个测试用例的call、setup、teardown过程)。
它会显示最慢的N个过程,耗时越长越靠前。
如果使用 --duration=0,则会将所有阶段按耗时从长到短排序后显示。如:
pytest --duration=3 xxx
--version 选项:
使用 --version 选项可以显示当前的 pytest 版本及安装目录,如:
pytest --version
-h(--help)选项:
即使你已经能够熟练使用pytest,-h 选项依然非常有用。它不但能展示原生pytest的用法,还能展示新添加的插件的选项和用法。
使用-h 选项可以获得:
- 基本用法:pytest [options] [file_or_dir] [file_or_dir] [...]
- 命令行选项及其用法,包括新添加的插件的选项及其用法
- 可用于 ini 配置文件中的选项
- 影响pytest行为的环境变量
- 使用pytest --markers 时的可用markers 列表
- 使用pytest --fixtures 时的可用fixture 列表
帮助信息最后会显示一句话,这句话的意思是:显示结果取决于指定的文件或目录,未指定的则默认使用当前目录和文件。
这句话非常重要,选项、marker、fixture 都会因为目录的变化而发生变化。
这是因为pytest有可能在某个叫 conftest.py 的文件中搜索到 hook 函数(新增命令行选项)、新的 fixture 定义及新的 marker 定义。
pytest允许你在conftest.py 和测试文件中自定义测试行为,期作用域仅仅是某个项目,甚至只是某个项目的子集。

浙公网安备 33010602011771号