pytest
拥有非常多的命令行运行参数用来支撑其强大的功能,笔者试了一下将它的命令行帮助信息导出到一个文件后发现整个帮助信息长达270行(基于5.4.3版本)!如果加上其他的插件新增的命令行参数这个数字会更大,那么如何从这么多的帮助信息中快速找到那些最常用的参数从而提高生产力呢?以下是笔者在使用过程中总结的一些小技巧,按照使用场景提炼一些经常会用到的命令行选项,希望对大家有帮助。
定位调试
-
--lf,--last-failed
,重新运行上次运行结果为失败的测试用例, 如果没有执行失败的用例则执行所有。场景:因为某次改动导致了多个测试用例失败了,那么我可以先执行一次全量测试找出所有失败的用例,待问题修复后,再次执行时带上这个选项就可以快速的进行验证。
这个的实现原理是:
pytest
会在每次执行时将该次执行失败的所有用例存到测试文件同级目录下的名为.pytest_cache/v/cache/lastfailed
的隐藏文件里,这样就清楚的标明了上次执行失败的用例。 -
-x,--exitfirst
,遇到第一个测试失败就立马退出。场景:当你需要跑一个全部通过的测试报告而整个测试非常耗时,可以通过加上这个选项,出现问题立马感知,避免无谓的等待。这个选项完全可以结合上面的
--lf
选项一起使用。 -
--pdb
, 当测试执行失败时,自动进入pdb
调试shell
。场景:用
selenium
写web测试脚本时这个特别有用,因为进入pdb
意味着程序暂停执行了,失败时的网页,变量值这些都还在,你拥有了一个鲜活的失败现场环境来定位问题了。这种方式在写作测试脚本时尤其好用,比起事后查看日志或者截图更加高效。注:准确的说是有
exception
时就会自动进入pdb
。因为我们在测试中使用assert
语句来判断一个用例的结果,assert
失败时其实是抛出一个AssertionError
的异常。触发机制跟我们在IDE中使用debug模式运行程序时一样的。 -
-l
, 将locals
信息同trackback
一起打印.有了这个选项,有时看一眼变量值就知道问题所在了即使使用
pdb
模式,大概率还是需要自己手动调用一下locals()
来获取变量值。 -
用pytest.ini配置默认选项, 因为某些选项十分常用,笔者一般使用下面的配置:
[pytest] addopts = -v -s --tb=short log_format = %(asctime)s %(levelname)s %(message)s log_date_format = %Y-%m-%d %H:%M:%S log_cli = false log_level = INFO
说明:
-
--tb=style
, traceback的打印模式,支持auto/long/short/line/native/no
这5种模式。我一般使用short,比较精简扼要,定位问题一般也够了。 -
-s
,case里面的print
输出默认会被捕获,带上这个选项,这些输出结可以正常打印到控制台了。 - log相关配置,一般用这种通用的输出格式即可,然后在需要开启的时候将
log_cli
设置为true
即可。
-
信息类
-
--collect-only
, 仅收集当前命令会执行的测试用例而不执行。对于参数化的测试用例(即使用了parametrize装饰器的用例),其实在测试收集阶段已经自动准备好了这些用例,比如下面的代码:import pytest @pytest.mark.parametrize("test_input,expected", [ ("3+5", 8), ("2+4", 6), pytest.param("6*9", 42, marks=pytest.mark.xfail), ]) def test_eval(test_input, expected): assert eval(test_input) == expected
执行的结果就是:
collected 3 items <Module test_parametrize.py> <Function test_eval[3+5-8]> <Function test_eval[2+4-6]> <Function test_eval[6*9-42]>
-
--cache-show
, 显示缓存信息,包括前面提到的last failed的case可以通过这种方式查看,输出类似于:cache\lastfailed contains: {'test_example.py::TestLogin::test_auth_fail': True} cache\nodeids contains: ['test_example.py::TestLogin::test_auth_pass', 'test_example.py::TestLogin::test_auth_fail'] cache\stepwise contains: []
--fixutres, --markers
分别获取可用的fixture和marker--setup-show
, 执行时显示setup/teardown的信息