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

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

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

通过 pycharm 执行时统计正常

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

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

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

共收到 14 条回复 时间 点赞
仅楼主可见
tester 回复

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

不懂哎

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

旗语珞 回复

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

追风 回复


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

旗语珞 回复

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

追风 回复



就这些,

9楼 已删除

还在接触

旗语珞 回复

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

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

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 的过程,应该对你有帮助

KinChung 回复

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

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']))

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