随笔 - 6  文章 - 5  评论 - 0  阅读 - 2006

Pytest使用基础

1 Pytest的运行

1.1 测试搜索

运行pytest时可以指定目录和文件。如果不指定,pytest会搜索当前目录及其子目录中以test_开头或以_test结尾的测试函数。【pytest搜索测试文件和测试用例的过程称为测试搜索】

只要你遵守pytest的命名规则,pytest就能自动搜索所有待执行的测试用例。

  • 测试文件应当命名为 test_<something>.py 或者 <something>_test.py
  • 测试函数、测试类方法应当命名为 test_<something>
  • 测试类应当命名为 Test<Something>

 测试文件和测试函数最好以test_开头,但如果先前编写的测试用例遵循的是其他命名规则,也可以修改默认的测试搜索规则。【配置章节介绍】

1.2 测试函数返回结果类型

  • PASSED(.):测试通过
  • FAILED(F):测试失败(也有可能是XPASS状态与strict选项冲突造成的失败
  • SKIPPD(s):测试未被执行。指定测试跳过执行,可以将测试标记为@pytest.mark.skip(),或者使用 @pytest.mark.skipif() 指定跳过测试的条件
  • xfail(x):预期测试失败,并且确实失败,使用@pytest.mark.xfail()指定你认为会失败的测试用例
  • XPASS(X):预期测试失败,但实际上运行通过,不符合预期
  • ERROR(R):测试用例之外的代码触发了异常,可能由fixture引起,也可能由hook函数引起

 1.3 使用命令行选项

  • --collect-only 选项

可以展示在给定的配置下哪些测试用例会被运行,让你非常方便地在测试运行之前,检查选中的测试用例是否符合预期。

  • -k 选项

允许你使用表达式希望运行的测试用例,如果某测试名是唯一的,或者多个测试名的前缀或后缀相同,那么可以使用表达式来快速定位。

假设希望选中 test_asdict() 和 test_defaults(),那么可以使用 --collect-only 验证筛选情况:

pytest -k "asdict or defaults" --collect-only
  • -m 选项

标记(marker)用于标记测试并分组,以便快速选中并运行。以 test_replace() 和 test_member_access() 为例,它们甚至都不在同一个文件里,如果你希望同时选中它们,那么可以预先做好标记。

复制代码
import pytest

......
@pytest.mark.run_these_please
def test_member_access():


@pytest.mark.run_these_please
def test_replace():
......
复制代码

这里我们使用 pytest -m run_these_please 命令就可以同时运行 test_replace() 和 test_member_access()

使用 -m 选项可以用表达式指定多个标记名。

(1)-m "mark1 and mark2" 可以同时选中带有这两个标记的所有测试用例

(2)-m "mark1 and not mark2" 则会选中带有 mark1 的测试用例

(3)-m “mark1 or mark2” 则选中带有 mark1 或者 mark2 的所有测试用例

  • -x, --exitfirst 选项 

正常情况下,pytest会运行每一个搜索到的测试用例,如果某个测试函数被断言失败,或者触发了外部异常,则该测试用例的运行就会到此为止,pytest将其标记为失败后会继续运行下一个测试用例。

通常,这就是我们期望的运行模式。但是在debug时,我们会希望遇到失败即立即停止整个会话,这是 -x 选项就派上用场了。

  • --maxfail=num

-x 选项的特点是,一旦遇到测试失败,就会全局停止。假设你允许pytest失败几次后再停止,则可以使用--maxfail选项,明确指定可以失败几次。

  • -s 与 --capture=method

-s 选项允许终端在测试运行时输出某些结果,包括任何符合标准的输出流信息。-s 等价于 --capture=no。

编写用例时,习惯添加几个print(),以便观察某时刻测试执行到了哪个阶段。

信息捕获方法还有 --capture==fd 和 --capture=sys,使用 --capture=sys 时,sys.stdout / stderr 将被输出至内存;使用 --capture=fd 时,若文件描述符为1或2,则会被输出至临时文件中

  • -l, --showlocals 选项

使用 -l 选项,失败测试用例由于被堆栈追踪,所以局部变量及其值都会显示出来。

使用 -l / --showlocals 选项,在测试失败时会打印出局部变量名和它们的值,这样可以规避一些不必要的print语句

  • --lf, --last-failed 选项

当一个或多个测试失败时,我们常常希望能够定位到最后一个失败的测试用例重新运行。只重新运行上次运行失败的用例(或如果没有失败的话会全部跑)

  • --ff, --failed-first 选项

运行所有测试,但首先运行上次运行失败的测试(这可能会重新测试,从而导致重复的fixture setup/teardown)

  • -v, --verbose 选项

使输出的信息会更详细

  • -q, --quiet 选项

简化输出信息

  • --tb=style 选项

决定捕捉到失败时输出信息的显示方式。某个测试用例失败后,pytest会列举出失败信息,包括失败出现在哪一行、是什么失败、怎么失败的,此过程我们称之为“信息回溯”。

大多数情况下,信息回溯是必要的,他对找到问题很有帮助,但有时也会对多余的信息感到厌烦。

(1)--tb=short:仅输出 assert 的一行以及系统判定内容(不显示上下文)

(2)--tb=line:模式仅使用一行输出显示所有的错误信息

(3)--tb=no:直接屏蔽全部回溯信息

(4)--tb=long:输出最为详尽的回溯信息

(5)--tb=auto:默认值,如果有多个测试用例失败,仅打印第一个和最后一个用例的回溯信息(格式同long)

(6)--tb=native:只输出Python标准库的回溯信息,不显示额外信息

  • --duration=N 选项

加快测试节奏,不关心测试时如何运行的,只统计测试过程中哪几个阶段是最慢的(包括每个测试用例的call、setup、teardown过程)。它会显示最慢的N个阶段,耗时越长越靠前。

  • --pyargs  选项
pytest --pyargs pkg.testing

This will import pkg.testing and use its filesystem location to find and run tests from.

导包(需具备__init__.py文件的python包)进来,执行该包下以test开头或结尾的测试文件

  • -p 加载插--还不太清楚用途

 1.4 配置文件

pytest.ini 文件是可选的,它保存了pytest 在该项目下的特定配置。项目中顶多包含一个配置文件,其中的指令可以调解 pytest 的工作行为,例如配置常用的命令行选项列表。

conftest.py 文件同样也是可选的,它是 pytest 的“本地插件库”,其中可以包含 hook 函数和 fixture。

hook函数可以将自定义逻辑引入 pytest,用于改善 pytest 的执行流程,fixture 则是一些用于测试前后执行配置及销毁逻辑的外壳函数,可以传递测试中用到的资源。

同一个项目内可以包含多个 conftest.py 文件。

posted on   ZouYus  阅读(539)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示