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 和测试文件中自定义测试行为,期作用域仅仅是某个项目,甚至只是某个项目的子集。

 

posted @ 2019-01-17 20:04  风聆  阅读(89)  评论(0)    收藏  举报