py.test 将消息和测试结果/断言记录到单个文件中

2024-01-02

我现在开始使用 py.test 来开发一个新项目。我们正在配置 Linux 服务器,我需要编写一个脚本来检查这些服务器的设置和配置。我认为 py.test 是实现这些测试的好方法,并且到目前为止它运行得很好。

我现在面临的问题是,我需要在这些测试结束时有一个日志文件,显示每个测试的一些日志消息和测试结果。对于日志消息,我使用记录器:

logging.basicConfig(filename='config_check.log', level=logging.INFO)
pytest.main()
logging.info('all done')

作为示例测试我有这个:

def test_taintedKernel():
    logging.info('checking for tainted kernel')
    output = runcmd('cat /proc/sys/kernel/tainted')
    assert output == '0', 'tainted kernel found'

所以在我的日志文件中我想要这样的输出:

INFO:root:checking for tainted kernel
ERROR:root:tainted kernel found
INFO:root:next test
INFO:root:successful
INFO:root:all done

但我无法将测试结果放入日志文件中,而是在测试后在 stdout 上获取标准输出:

======================================= test session starts =======================================
platform linux2 -- Python 2.6.8 -- py-1.4.22 -- pytest-2.6.0
collected 14 items 

test_basicLinux.py .............F

============================================ FAILURES =============================================
_______________________________________ test_taintedKernel ________________________________________

    def test_taintedKernel():
        logging.info('checking for tainted kernel')
        output = runcmd('cat /proc/sys/kernel/tainted')
>       assert output == '0', 'tainted kernel found'
E       AssertionError: tainted kernel found

test_basicLinux.py:107: AssertionError
=============================== 1 failed, 13 passed in 6.07 seconds ===============================

这对于我的脚本的用户来说可能会很困惑。我尝试进入 logger 和 pytest_capturelog 因为这里经常提到它,但我肯定做错了什么,因为我只是不明白。也许只是缺乏了解这到底是如何运作的。希望你能给我一些这方面的提示。如果这里缺少任何内容,请告诉我。

在此先感谢您的帮助,

Stephan


pytest 的工作是捕获输出并将其呈现给操作员。因此,您可以将日志记录构建到测试中,而不是尝试让 pytest 按照您想要的方式进行日志记录。

蟒蛇的assert命令只需要一个真值和一条消息。因此,不要使用裸露的assert在测试中,您可以编写一个小函数,如果值为 false(这与触发断言失败的条件相同),则执行日志记录,然后调用断言,以便获得所需的日志记录以及断言创建控制台输出的驱动行为。

这是一个使用此类函数的小测试文件:

# test_foo.py
import logging

def logAssert(test,msg):
    if not test:
        logging.error(msg)
        assert test,msg

def test_foo():
    logging.info("testing foo")
    logAssert( 'foo' == 'foo', "foo is not foo")

def test_foobar():
    logging.info("testing foobar")
    logAssert( 'foobar' == 'foo', "foobar is not foo")

这是测试运行程序,与您的非常相似:

# runtests.py
import logging
import pytest

logging.basicConfig(filename='config_check.log', level=logging.INFO)
logging.info('start')
pytest.main()
logging.info('done')

这是输出:

# python runtests.py
==== test session starts ========================
platform linux2 -- Python 2.6.6 -- py-1.4.22 -- pytest-2.6.0
collected 2 items

test_foo.py .F

========== FAILURES ============================
________ test_foobar __________________________

    def test_foobar():
        logging.info("testing foobar")
>       logAssert( 'foobar' == 'foo', "foobar is not foo")

test_foo.py:14:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

test = False, msg = 'foobar is not foo'

    def logAssert(test,msg):
        if not test:
            logging.error(msg)
>           assert test,msg
E           AssertionError: foobar is not foo

test_foo.py:6: AssertionError    ==== 1 failed, 1 passed in 0.02 seconds =======

这是写入的日志:

# cat config_check.log 
INFO:root:start
INFO:root:testing foo
INFO:root:testing foobar
ERROR:root:foobar is not foo
INFO:root:done
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

py.test 将消息和测试结果/断言记录到单个文件中 的相关文章

随机推荐

  • 将字符串作为参数传递给 python 脚本

    我想将一串 ZPL 代码从一个 python 脚本传递到另一个 python 脚本 在第二个脚本中使用该字符串时 该字符串的格式会出现错误 如何将字符串文字作为参数传递给另一个 python 脚本而不导致格式错误 原始字符串 XA FO20
  • kubernetes 仪表板错误:“指标客户端运行状况检查失败:服务器找不到请求的资源(获取服务堆)。”

    我是 kubernetes 世界的新手 所以如果我写错了 请原谅我 我正在尝试部署 kubernetes 仪表板 我的集群包含 3 个主节点和 3 个工作节点 这些节点已被耗尽且不可调度 以便将仪表板安装到主节点 root pp tmp t
  • 堆栈溢出错误与无限循环

    我知道什么是无限循环错误 堆栈溢出错误是同一件事吗 如果不是 有什么区别 您也可以给出示例代码吗 如果不是无限循环 而是无限 或非常深 递归 函数调用自身 那么您将出现堆栈溢出 每当调用函数时 都会消耗堆栈内存的一部分 一旦所有堆栈耗尽 您
  • AWS S3 对象列表

    I am using aws sdk using node js I want to list images in specified folder e g 我想列出此位置中的所有文件和文件夹 但不列出文件夹 图像 内容 有列表对象函数 h
  • jointjs:防止通过单击链接添加顶点

    我想通过双击链接来向链接添加标签 所以这是我的尝试 paper on cell pointerdblclick function cellView event x y if cellView model isLink cellView mo
  • 连接局域网内另一台PC上的MySQL服务器

    我在我的 PC 上安装了 MySQL本地网络 我如何连接到它 我还在这台计算机上安装了 MySQL 我想用它来连接到数据库 我尝试了以下方法 但它不起作用 mysql u user h 192 168 1 28 3306 p passwor
  • MapBox iOS MGLPolyline 跨越(180 或 -180)经度时出现问题

    在 MapBox iOS sdk 4 4 1 中 如果 MGLPolyline 穿过 180 或 180 经度 地图显示它正在绕地球走更长的路 而不是走更短的路 override func viewDidAppear animated Bo
  • Python:避免嵌套 IF 语句的流程

    我有一个过程 类 我将其分为几个步骤 方法 仅当前一步成功时才能调用每一步 我创建了一个 run 方法 它通过在调用下一个步骤之前检查每个步骤来运行该流程 def run self status False if step 1 if ste
  • 我应该在每次请求时动态生成每个缩略图,还是将它们存储在图像上传中? [复制]

    这个问题在这里已经有答案了 Problem 我想在我的网站中设置图像上传功能 但我想同时显示原始图像和图像的小缩略图 Choices 哪种方法更好 上传图像时在目录中创建单独的图像 缩略图 还是每次请求图像时通过以固定比例减小其高度和宽度来
  • 如何找到 UIWebView 的最后一次加载(Ready State 4)

    我有一个问题didFinishLoad中的方法UIWebView那就是不断射击 我想尝试一下估计的进度solution http winxblog com 2009 02 iphone uiwebview estimated progres
  • 通过函数更新数据框不起作用

    我在使用 R 时遇到了一个小问题 在下面的数据框中 test lt data frame v1 c rep 1 3 rep 2 3 v2 0 我想更改 v1 为 1 的行中 v2 的值 test test v1 1 v2 lt 10 工作得
  • Grails 域类:hasOne、hasMany 不包含 ownTo

    我是 Grails 新手 我可以使用 hasOne 或 hasMany 而不使用 belongsTo 到另一个域类吗 提前致谢 是的你可以 请参阅 Grails 文档中的示例 http grails org doc 2 3 8 guide
  • 获取输出帧失败,状态 8196

    当我尝试自定义 tableView 单元格时 我发现了此错误 获取输出帧失败 状态 8196 我只是不知道这是来自领域或我的自定义 tableView 单元格的错误 class StudentTableViewController UITa
  • prettier 配置错误,prettier 不起作用

    我在更漂亮时遇到了错误 怎么解决这个问题 https i stack imgur com gTMp9 png 看起来 无论出于何种原因 在它要查找的位置 即根文件夹 中都没有 Prettier 的配置文件 我会检查是否 prettierrc
  • 适用于 iPhoneSDK 的 Bing 地图

    有谁知道如何使用 bing 地图创建简单的 iPhone 应用程序 Bing Mobile Bing Maps 团队于 2011 年 5 月上旬发布了适用于 iPhone 和 iPad 的新 Bing Maps iOS SDK 您可以下载该
  • asp.net MVC 解决方案/项目布局 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这更多的是一个开放性问题 而不是寻找一个具体的答案 众所周知 没有一个答案适合所有解决方案 但我很想知道您如何构建 ASP NET MVC 解决
  • 有没有办法使用 JavaScript 引入 Internet Explorer 条件注释?

    我有一段 HTML 代码 其中包含条件注释 该代码经过测试 在初始页面呈现时包含在页面的 HEAD 部分中时可以正常工作 我想在 Ajax 响应中使用 JavaScript 将相同的条件 CSS 引入到现有页面 我努力了 var comme
  • Databricks 仅打印大约 280 行数据

    我正在 Databricks 中运行一些大型作业 目前包括盘点数据湖 我正在尝试打印前缀 子文件夹 内的所有 blob 名称 这些子文件夹中有很多文件 我打印了大约 280 行文件名 但随后我看到了以下内容 WARNING skipped
  • PHP 还是普通 Perl CGI 更快?

    我正在为 Apache 共享托管服务器开发一个 Web 应用程序 我已经用 Perl 编写了一些代码 但最近令我惊讶的是 我发现共享托管提供商没有提供 mod perl 或安装它的方法 我一直有点担心在没有 mod perl 的情况下通过
  • py.test 将消息和测试结果/断言记录到单个文件中

    我现在开始使用 py test 来开发一个新项目 我们正在配置 Linux 服务器 我需要编写一个脚本来检查这些服务器的设置和配置 我认为 py test 是实现这些测试的好方法 并且到目前为止它运行得很好 我现在面临的问题是 我需要在这些