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

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的信息

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342