自动化工具 pytest 打印用例结果问题

旗语珞 · 2023年02月22日 · 最后由 旗语珞 回复于 2023年03月06日 · 7249 次阅读

我使用 pytest 的内置 hook 获取每个用例的状态做统计

通过 pycharm 执行时统计正常

但是通过 CMD 命令行执行,统计就出问题,正确用例比我总用例都多,

完全没变,只是执行了 python run.py ,和 pycharm 执行方式等于一致的,

求教大佬是什么问题?是 pytest 的版本导致,还是说装了什么插件影响的?

共收到 14 条回复 时间 点赞

pytest_terminal_summary 这个 pytest 内置函数在 pycharm 运行 pytest 情况下,pass 用例数只会统计用例"call"阶段,在通过 cmd 命令行执行下,pass 用例数会统计"setup","call","teardown"3 个阶段,虽然不知道为什么,想要显示正确,要写成 _PASSED = (len([i for i in terminalreporter.stats.get('passed', []) if i.when == 'call']))

KinChung 回复

你这个是 pytest 的用来查看每个用例执行完的内置方法,然后自己统计所有用例结果状态,这个在 pytest 有另外一个内置方法专门统计,就是 pytest_terminal_summary,我现在是这个内置方法统计正确结果在命令行模式执行下统计错误

pytest 用例执行过程都分为三段:setup、call、teardown,在代码中好像没看到统计的是哪一阶段的数量,建议是定死读取 call,这样应该才符合你的预期

@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    logging.info('------------------------------------')
    out = yield
    report = out.get_result()
    if report.when == "call":
        logging.info('测试报告:%s' % report)
        logging.info('步骤:%s' % report.when)
        logging.info('nodeid:%s' % report.nodeid)
        logging.info('description:%s' % str(item.function.__doc__))
        logging.info(('运行结果: %s' % report.outcome))
        if report.outcome == 'passed':
            result['passed'] += 1
        elif report.outcome == 'failed':
            result['failed'] += 1

这是我一段 hook 代码,用来在日志里输出当前步骤和执行结果,并且在最后统计当前 pass 数和 fail 数,里面我只拿 call 的过程,应该对你有帮助

少年 chatgpt 最近体验的一些心得 中提及了此贴 02月23日 11:45
旗语珞 回复

打印的 test_350853 用例怎么有两个 set_up 阶段,passed 参数打印里面不含 set_up 和 tear_down 阶段,总感觉可能代码哪里写得有问题😂

还在接触

8楼 已删除
追风 回复



就这些,

旗语珞 回复

你的 run.py 中 main 函数里面的参数都写了哪些?

追风 回复


这是我刚打印的,就跑了一条,pycharm 执行显示成功 0,命令行执行显示通过 3 条,他会不会是吧 setup,teardown 都算上了?这段代码我抄的网上的

旗语珞 回复

pycharm 可以看到 pytest 的版本,全局的可以用 pip show pytest 命令看下

可以试着把都执行了哪些用例打出来看一下。因为你总执行用例数是 7,不太像是一个用例执行多次,建议还是打出来看一下到底都执行了什么

不懂哎

tester 回复

都是最新的 7.2.1,我 pycharm 直接导入的是默认 python 环境,没有用虚拟环境,应该都一样吧

仅楼主可见
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册