pytest入门
- 示例
- 成功
- 失败
- 1.1 资源获取
- 官方文档
- 安装
- 1.2 运行 Pytest
- 测试搜索
- 命名规则
- 1.3 运行单个测试用例
- 1.4 使用命令行选项
- -h(--help)
- --collect-only
- -k
- -m
- -x
- --maxfail=num
- -s 与 --capture=method
- -s 等价于 --capture=no
- --capture=sys
- --capture=fd
- -l(--showlocals)
- --lf(--last-failed)
- --ff(--failed-first)
- -v(--verbose)
- -q(--quiet)
- --tb=style
- --tb=no
- --tb=line
- --tb=short
- -tb=long
- --tb=auto
- --tb=native
- durations=N
- durations=0
- --version
示例
成功
失败
1.1 资源获取
官方文档
安装
pip install pytest
1.2 运行 Pytest
$ pytest --help
usage: pytest [options] [file_or_dir] [file_or_dir] [...]
...
- 若不提供任何参数,将在当前及其子目录下寻找测试文件,然后运行搜索到的测试代码
- 若提供一个或多个文件名、目录名,将逐个查找并运行所有测试
- 重复写将重复运行
ch1/tasks/test_three.py
"""Test the task data type."""
from collections import namedtuple
Task = namedtuple('Task', ['summary', 'owner', 'done', 'id'])
# 创建默认的 Task 对象,不必指定所有属性
Task.__new__.__defaults__ = (None, None, False, None)
def test_defaults():
"""Using no parameters should invoke defaults."""
t1 = Task()
t2 = Task(None, None, False, None)
assert t1 == t2
def test_member_access():
"""Check .field functionality of nametuple."""
t = Task('buy milk', 'brian')
assert t.summary == 'buy milk'
assert t.owner == 'brian'
assert (t.done, t.id) == (False, None)
ch1/tasks/test_four.py
"""Test the task data type"""
from collections import namedtuple
Task = namedtuple('Task', ['summary', 'owner', 'done', 'id'])
Task.__new__.__defaults__ = (None, None, False, None)
def test_asdict():
"""_asdict() should return a dictionary."""
t_task = Task('do something', 'okken', True, 21)
t_dict = t_task._asdict()
expected = {'summary': 'do something',
'owner': 'okken',
'done': True,
'id':21}
assert t_dict == expected
def test_replace():
"""_replace() should change passed in fields."""
t_before = Task('finish book', 'brian', False)
t_after = t_before._replace(id=10, done=True)
t_expected = Task('finish book', 'brian', True, 10)
assert t_after == t_expected
测试搜索
定义:pytest 搜索测试文件和用例的过程
- 只要遵守 pytest 的命名规则,pytest 就能自动搜索所有待执行的测试用例
命名规则
- 测试文件:test_something.py(Better) 或 something_test.py
- 测试函数/测试类方法:test_something
- 测试类:TestSomething
1.3 运行单个测试用例
指定文件后加 ::test_name
1.4 使用命令行选项
-h(–help)
查看全部选项
- 输出末尾声明:显示结果取决于所指定的文件或目录,未指定则默认使用当前目录和文件
–collect-only
展示哪些测试用例会被运行
-k
使用表达式指定希望运行的测试用例
-m
标记测试并分组并分组
- 可跨文件
- 标记名自定义
- 测试方法上方使用
@pytest.mark.标记名称
做标记 - 可用表达式指定多个标记名以选中测试用例
-m "mark1 and mark2"
:同时带有这两个标记-m "mark1 and not mark2"
:带有 mark1 且不带 mark2-m "mark1 or mark2"
:带有 mark1 或 mark 2
-x
遇到失败时立即停止整个会话
- 不用该选项的默认情况:断言失败或外部异常时,将该用例标记为失败并继续运行下一个
–maxfail=num
失败几次后再停止
-s 与 --capture=method
-s 等价于 --capture=no
允许终端在测试运行时将输出流信息与运行结果一起输出,而关闭默认的输出捕获
–capture=sys
sys.stdout/stderr 将被输出至内存
–capture=fd
若文件描述符为1或2,则会被输出至临时文件中
-l(–showlocals)
测试失败时打印出局部变量名和值
- 以便规避不必要的 print 语句
–lf(–last-failed)
重新运行最后一个失败的测试用例
–ff(–failed-first)
作用与--last-failed
基本相同,区别是--ff
会运行完剩余的测试用例
-v(–verbose)
输出信息更详细
- 每个测试用例都占一行(原本是每个文件占一行)
- 测试的名字和结果都会显示出来,而不仅仅是一个点或字符
-q(–quiet)
简化输出信息,只保留核心内容(与-v/--verbose
相反)
–tb=style
决定捕获到失败时输出信息(信息回溯)的显示方式
–tb=no
屏蔽全部回溯信息
–tb=line
仅打印异常的代码位置
–tb=short
仅输出 assert 的一行以及系统判定内容(不显示上下文)
-tb=long
输出最为详尽的回朔信息
–tb=auto
默认值
- 若有多个测试用例失败,仅打印首末两个用例的回溯信息
- 格式与
long
模式的一致
–tb=native
只输出 Python 标准库的回溯信息,不显示额外信息
durations=N
显示最慢的 N 个阶段,耗时越长越靠前
- 统计时包括每个测试用例的 call、setup、teardown 过程
durations=0
将所有阶段按耗时从长到短排序后显示
–version
显示当前 pytest 的版本及安装目录