Pytest 2 - pytest 选项详解
pytest有很多选项,可以帮助我们运行心目中指定的测试用例。
假设已经存在以下文件:
ch1/test_one.py
/test_two.py
/test_three.py
/test_four.py
内容如下:
test_one.py
def test_passing(): assert (1,2,3) == (1,2,3)
test_two.py
def test_failed(): assert (1,2,3) == (3,2,1)
test_three.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_default(): """Useing no parameters should invoke defaults""" t1 = Task() t2 = (None, None, False, None) assert t1 == t2 def test_member_access(): """Check .field functionality of namedtuple""" t= Task('buy milk','brian') assert t.Summary == 'buy milk' assert t.owner == 'brian' assert (t.done, t.id) == (False, None)
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_default(): """Useing no parameters should invoke defaults""" t1 = Task() t2 = (None, None, False, None) assert t1 == t2 def test_member_access(): """Check .field functionality of namedtuple""" t= Task('buy milk','brian') assert t.Summary == 'buy milk' assert t.owner == 'brian' assert (t.done, t.id) == (False, None)
使用命令行选项
1. pytest -- help 查看全部选项
2. -v选项,查看运行详情
(1) 带 -v时:
(2) 带 -v时:
3. --collect-only 选项, 可以在真正运行用例之前使用此命令,来查看将要运行的用例是否正确。
4. -k 匹配表达式来只运行和表达式匹配的用例,包括文件名及用例方法的匹配。
(1) 匹配文件名:pytest -k four
(2) 匹配方法名:pytest -k asdict
(3)匹配多个条件 or: pytest -k "asdict or replace"
(4)匹配多个条件 and: pytest -k "asdict and replace"
5. -m 选项(marker标记), 用于标记测试并分组,以便迅速选中并运行。以test_replace()和test_member_access()为例。他们不再一个文件里,但如果希望同时选中它们,可以先做好标记。
- -m 运行文件中标记过pytest.mark.XXX 中的XXX符合的用例
- -m "mark1 and mark2" 用于运行两个标记都满足的用例
- -m "mark1 or mark2" 用于运行两个标记满足其一的用例
(1) 更改测试用例装饰器
a. 将test_three.py内容改为
""" Test the Task data type. """ from collections import namedtuple import pytest # 新增 Task = namedtuple("Task", ['Summary', 'owner', 'done', 'id']) Task.__new__.__defaults__ = (None, None, False, None ) def test_default(): """Useing no parameters should invoke defaults""" t1 = Task() t2 = (None, None, False, None) assert t1 == t2 @pytest.mark.run_thest_please # 新增 def test_member_access(): """Check .field functionality of namedtuple""" t= Task('buy milk','brian') assert t.Summary == 'buy milk' assert t.owner == 'brian' assert (t.done, t.id) == (False, None)
b. test_four.py文件内容更改为
""" Test the Task data type. """ from collections import namedtuple import pytest #新增 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 @pytest.mark.run_these_please #新增 def test_replace(): """_replace() should change passed in fields""" t_before = Task('finished book', 'brian', False) t_after = t_before._replace(id=21, done=True) t_expected = ('finished book', 'brian', True, 21) assert t_after == t_expected
(2) 只运行run_these_please的用例:pytest -v -k run_these_please
6. -x选项。 通常有多个用例时,一个失败会继续运行剩余的用例。如果在debug时想要一个用例失败既停止,可使用-x选项:pytest -x
以上因为失败的是最后一个文件看不出效果,添加了一个test_failed.py文件并运行,可以看出只运行了一个文件。
7. --maxfail=num. -x是只要碰到一次失败就停止。而maxfail可以设置失败num次后停止:pytest --maxfail=2
8. --lf(--last-failed),只运行最后一次失败的用例。
9. --ff(--failed-first), 先跑运行失败的用例。
10. -v(--verbose) 查看详情
11. -q(--quiet),与-v相反,简化输出信息。通常与--tb=line(仅打印异常的代码位置)搭配使用
12. -l(--showlocals) ,由于失败用例被堆栈追中,局部变量及其值都会显示出来。
13. --tb=stype,失败时显示的失败信息。 --tb = short(仅显示assert的一行及系统判断内容)/line(只使用一行显示所有错误信息)/no(屏蔽所有回溯信息)
14. --duration=N , 显示用例中最慢的N个阶段,耗时越长显示在越前面。
--duration = 0,则会将所有阶段耗时从长到短排序后显示。
15. --version,查看当前pytest版本。
16. -h(--help), 查看原生pytest的用法,展示新添加的插件的选项及用法。
以上内容为【pytest测试实践】的读书笔记,用于日后复习与巩固。