程序员

你可能不知道的pytest使用小技巧

2020-07-26  本文已影响0人  小餐包

pytest拥有非常多的命令行运行参数用来支撑其强大的功能,笔者试了一下将它的命令行帮助信息导出到一个文件后发现整个帮助信息长达270行(基于5.4.3版本)!如果加上其他的插件新增的命令行参数这个数字会更大,那么如何从这么多的帮助信息中快速找到那些最常用的参数从而提高生产力呢?以下是笔者在使用过程中总结的一些小技巧,按照使用场景提炼一些经常会用到的命令行选项,希望对大家有帮助。

定位调试

  1. --lf,--last-failed,重新运行上次运行结果为失败的测试用例, 如果没有执行失败的用例则执行所有。

    场景:因为某次改动导致了多个测试用例失败了,那么我可以先执行一次全量测试找出所有失败的用例,待问题修复后,再次执行时带上这个选项就可以快速的进行验证。

    这个的实现原理是:pytest会在每次执行时将该次执行失败的所有用例存到测试文件同级目录下的名为.pytest_cache/v/cache/lastfailed的隐藏文件里,这样就清楚的标明了上次执行失败的用例。

  2. -x,--exitfirst,遇到第一个测试失败就立马退出。

    场景:当你需要跑一个全部通过的测试报告而整个测试非常耗时,可以通过加上这个选项,出现问题立马感知,避免无谓的等待。这个选项完全可以结合上面的--lf选项一起使用。

  3. --pdb, 当测试执行失败时,自动进入pdb调试shell

    场景:用selenium写web测试脚本时这个特别有用,因为进入pdb意味着程序暂停执行了,失败时的网页,变量值这些都还在,你拥有了一个鲜活的失败现场环境来定位问题了。这种方式在写作测试脚本时尤其好用,比起事后查看日志或者截图更加高效。

    注:准确的说是有exception时就会自动进入pdb。因为我们在测试中使用assert语句来判断一个用例的结果,assert失败时其实是抛出一个AssertionError的异常。触发机制跟我们在IDE中使用debug模式运行程序时一样的。

  4. -l, 将locals信息同trackback一起打印.

    有了这个选项,有时看一眼变量值就知道问题所在了即使使用pdb模式,大概率还是需要自己手动调用一下locals()来获取变量值。

  5. 用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即可。

信息类

  1. --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]>
    
  1. --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:
      []
    
  2. --fixutres, --markers分别获取可用的fixture和marker

  3. --setup-show, 执行时显示setup/teardown的信息

上一篇下一篇

猜你喜欢

热点阅读