前言:

之前同事在跑脚本的时候报错了,发现没法把需要的log信息打印出来,我这边定位问题比较麻烦,所以增加了log的打印。这个问题之前已经处理过了,本来以为是小问题,结果今天又要用到这个小技巧的时候居然想不起来了,还得去翻代码(忘性越来越大了( ̄_ ̄|||)想想还是决定把它记录下来,并且总结一下相关知识点。

需要解决的问题:

  1. 代码里添加的logging模块的报错信息不打印
  2. 没法打印pytest的报错信息
  3. 某个功能添加了try...except去捕获异常,打印了自定义的报错信息,捕获异常之后让用例fail,并打印原有的报错信息

处理方法:

一、 使用pytest_runtest_makereport方法打印 pytest的故障信息和用例执行结果

  1. 添加conftest.py文件
  2. 写pytest_runtest_makereport方法
import os
import pytest
import logging @pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
out = yield
res = out.get_result()
print(res)
if res.when == "call":
logging.info(f"item:{item}")
logging.info(f"异常:{call.excinfo}")
logging.info(f"故障表示:{res.longrepr}")
logging.info(f"测试结果:{res.outcome}")
logging.info(f"用例耗时:{res.duration}")
logging.info("**************************************")

相关知识点:

  1. pytest_runtest_makereport(item, call)是pytest带有的钩子函数

    测试用例的执行结果会自动跳到这个函数,在这个函数下可以编辑代码进行一些操作

    item为用例对象

    call为用例的测试步骤(pytest的执行流程为 setup -> call ->teardown)
  2. res.longrepr 返回的是pytest的报错信息,通过打印这个值,可以像在控制台一样获取报错的文件行号等信息

二、 添加log文件,使得报错信息打印在本地log文件中

  1. conftest.py文件中写pytest_configure方法,设置log文件路径
  2. pytest.ini文件中 设置log的级别、格式等信息
# conftest.py
def pytest_configure(config):
config.option.log_file = os.path.join(config.rootdir, 'log', 'log.log')

相关知识点:

  1. config.rootdir 为项目的根目录
# pytest.ini
[pytest]
log_cli = 1
log_cli_level = INFO
log_cli_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
log_cli_date_format = %Y-%m-%d %H:%M:%S
log_file_level = INFO
log_file_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
log_file_date_format = %Y-%m-%d %H:%M:%S

相关知识点:

  1. log_cli = 1 输出日志到控制台
  2. log_cli_level = INFO 设置控制台日志级别,注意:这里设置之后,脚本文件里设置的导入logging模块, logging.basicConfig(level=logging.DEBUG)设置的日志级别就不起作用了
  3. log_cli_format 设置控制台日志格式
  4. log_cli_date_format 设置控制台输出的时间格式
  5. log_file_format 设置输出到log文件的日志格式
  6. log_file_date_format 设置输出到log文件的时间格式

三、 在脚本文件中try...except捕获错误,打印需要的信息后,再把这个错误暴露出来,让这条用例failed

  1. 如果不try...except的话,pytest返回的报错信息为代码的错误信息,但是没法显示出给出想要的提示信息

  2. 通过try...except之后,代码就不会报错,错误就会被隐藏,所以必须让pytest报错,并且把原先代码的错误信息显示出来

# 这部分是我自己的脚本代码,就简单举个例子

def mycode:
a = 3
b = [1,2]
try:
out = b[a]
except IndexError as e: # 捕获异常,并把报错信息存在 e 中
loggging.error(f"列表b的长度不够,需要先把b的长度扩展到{a}个元素") # 打印自己想要的提示信息
pytest.fail(str(e)) # 再把这个报错暴露出来,打印捕获到的报错信息

pytest框架增加log打印(包括pytest的执行结果、自定义的log信息)的更多相关文章

  1. 『德不孤』Pytest框架 — 3、Pytest的基础说明

    目录 1.Pytest参数介绍 2.Pytest框架用例命名规则 3.Pytest Exit Code说明 4.pytest.ini全局配置文件 5.Pytest执行测试用例的顺序 1.Pytest参 ...

  2. android-----JNI中的log打印

    1. 导入log头文件 在你使用的 .c/ .cpp 文件中 导入 log.h 头文件 #include<android/log.h> 2.在Android.mk 中 加上 LOCAL_L ...

  3. android-----JNI中的log打印【转】

    本文转载自:http://blog.csdn.net/zengraoli/article/details/11644815 1. 导入log头文件 在你使用的 .c/ .cpp 文件中 导入 log. ...

  4. pytest框架之命令行参数1

    前言 pytest是一款强大的python自动化测试工具,可以胜任各种类型或者级别的软件测试工作.pytest提供了丰富的功能,包括assert重写,第三方插件,以及其他测试工具无法比拟的fixtur ...

  5. pytest框架之fixture详细使用

    本人之前写了一套基于unnitest框架的UI自动化框架,但是发现了pytest框架之后觉得unnitest太low,现在重头开始学pytest框架,一边学习一边记录,和大家分享,话不多说,那就先从p ...

  6. pycharm中脚本执行的3种模式(unittest框架、pytest框架、普通模式)

    背景知识,某次使用HTMLTestRunner的时候,发现一直都无法导出报告,后来查询资料发现了一些坑,现在整理一下来龙去脉. 一:pycharm默认的是pytest框架去执行unittest框架的测 ...

  7. Appium 并发多进程基于 Pytest框架

    前言: 之前通过重写unittest的初始化方法加入设备参数进行并发,实现了基于unittest的appium多设备并发,但是考虑到unittest的框架实在过于简陋,也不方便后期的Jenkins的持 ...

  8. 【Pytest01】全网最全最新的Pytest框架快速入门

    一.Pytest简介pytest是一个非常成熟的全功能的Python测试框架,主要有一下几个特点:1.简单灵活,容易上手,支持参数化2.能够支持简单的单元测试和复杂的功能测试,还可以用来做seleni ...

  9. python之pytest框架实现

    一.pytest测试框架简介: pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点: 简单灵活,容易上手 支持参数化 能够支持简单的单元测试和复杂的功能测试,还可以用来做se ...

  10. Pytest测试框架(一):pytest安装及用例执行

    PyTest是基于Python的开源测试框架,语法简单易用,有大量的插件,功能非常多.自动检测测试用例,支持参数化,跳过特定用例,失败重试等功能. 安装 pip install -U pytest  ...

随机推荐

  1. [OpenCV实战]46 在OpenCV下应用图像强度变换实现图像对比度均衡

    本文主要介绍基于图像强度变换算法来实现图像对比度均衡.通过图像对比度均衡能够抑制图像中的无效信息,使图像转换为更符合计算机或人处理分析的形式,以提高图像的视觉价值和使用价值.本文主要通过OpenCV ...

  2. [编程基础] C++多线程入门9-async教程和示例

    原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 文章目录 9 asy ...

  3. [LeetCode]螺旋矩阵

    题目 代码 class Solution { public: vector<int> spiralOrder(vector<vector<int>>& ma ...

  4. 解决前端发送post 请求出现403,cancled等问题

    问题一:页面初始加载,部分接口首次请求options是200,然后第二次post请求cancled状态 1. 检查console控制台报错,如果是接口问题,就不用操心了 2.如果是其他报错,那么就不用 ...

  5. Flutter踩坑日记,自己挖的坑,哭着也要走出来。

    1. 系统运行缓慢,疯狂点击右上角小X,再次启动后Emulator启动黑屏,关机重启也不好使,其他 Emulator也无法使用. 执行以下步骤: 第一检查内存是否够用 啊  不够用了 那么 [解决方法 ...

  6. What's new in Dubbo 3.1.5 and 3.2.0-beta.4

    在 1 月 27 日,新年伊始,Dubbo 3.1.5 和 3.2.0-beta.4 正式通过投票发布.本文将介绍发布的变化一览. Dubbo 3.1.5 版本是目前 Dubbo 3 的最新稳定版本, ...

  7. QtQuick使用MediaPlayer抓取摄像头影响报错Error: "Your GStreamer installation is missing a plug-in."

    环境:ubuntu18.04 Qt5.9.5 描述:项目需要使用qtquick作为显示界面用于播放从网络摄像头抓取的影像,海康网络摄像头,摄像头源协议使用的是rtsp,影像数据格式为x-h264,但在 ...

  8. 笔记: C#RabbitMQ初步使用记录

    Rabbitmq 的使用场景有哪些? ①. 跨系统的异步通信,所有需要异步交互的地方都可以使用消息队列.就像我们除了打电话(同步)以外,还需要发短信,发电子邮件(异步)的通讯方式. ②. 多个应用之间 ...

  9. C#反射运行该类下的方法

    Text:反射的类名 s:方法名 data:参数 如果无参则: (string)method.Invoke(obj, null); Type type = typeof(Text); MethodIn ...

  10. saas解决redis数据库分离的一种方案

    package com.xf.config; import java.util.HashMap; import java.util.Map; import java.util.Set; import ...