gpt4 book ai didi

python - 断言改进

转载 作者:行者123 更新时间:2023-12-04 08:33:54 25 4
gpt4 key购买 nike

目前在我工作的公司,我们有一个框架来运行测试。我们希望集成 pytest 以便能够以 pytest 方式编写测试,但我们需要旧框架来处理它在后台所做的所有事情。
我面临的问题是关于断言。目前我们有一堆断言函数。它们都使用私有(private)方法来写入 python 日志记录和 json 文件。我想摆脱它们,只使用“断言”。
到目前为止,我所做的是使用我创建的自定义模块对 _pytest.assertion.rewrite.py 进行monkeypatch,我在其中更改了 visit_Assert 方法并在第 873 行之后添加了这段代码:

if isinstance(assert_.test, ast.Compare):
test_value = BINOP_MAP[assert_.test.ops[0].__class__]
test_type = "Comparison"
elif isinstance(assert_.test, ast.Call):
test_value = str(assert_.test.func.id)
test_type = "FunctionCall"
然后我调用上面提到的同一个私有(private)方法来保存结果。
正如您可能猜到的那样,我认为这不是最好的方法:有更好的方法吗?
我尝试了不同的钩子(Hook),但找不到我需要的信息(断言正在做的比较是什么),特别是因为 pytest 在测试失败时非常好(这是有道理的),但在测试失败时信息并不那么丰富测试通过。

最佳答案

这在一定程度上取决于您使用的是哪个版本的 Pytest,因为这些钩子(Hook)正在非常活跃的开发中。但是在任何相对较新的版本中,您都可以实现 Hook pytest_assertrepr_compare ,调用它来报告失败的断言的自定义错误消息。这个方法可以定义在conftest.py , 和 pytest会很乐意使用该定义。
像这样的方法:

def pytest_assertrepr_compare(config, op, left, right):
print("Call legacy method here")
return None
将指示 pytest不需要自定义错误消息(即 return None 部分),但它允许您在断言失败时调用任意代码。
例如,运行 pytest在一个虚拟测试文件上, test_foo.py内容:
def test_foo():
assert 0 == 1, "No bueno"
应该在您的终端上给出以下输出:
================================================= test session starts ==================================================
platform darwin -- Python 3.9.0, pytest-6.1.2, py-1.9.0, pluggy-0.13.1 -- /usr/local/opt/python@3.9/bin/python3.9
cachedir: .pytest_cache
rootdir: /Users/bnaecker/tmp
plugins: cov-2.10.1
collected 1 item

foo.py::test_foo FAILED [100%]

======================================================= FAILURES =======================================================
_______________________________________________________ test_foo _______________________________________________________

def test_foo():
> assert 0 == 1, "No bueno"
E AssertionError: No bueno
E assert 0 == 1
E +0
E -1

foo.py:6: AssertionError
------------------------------------------------- Captured stdout call -------------------------------------------------
Call legacy method here
=============================================== short test summary info ================================================
FAILED foo.py::test_foo - AssertionError: No bueno
================================================== 1 failed in 0.10s ===================================================
捕获的标准输出是调用您的自定义日志记录功能的替身。另外,请注意我正在使用 pytest-6.1.2 ,并且不清楚何时包含此钩子(Hook)。在 5.0 中引入了其他类似的钩子(Hook),因此 >=6.0 中的任何内容都可以,但 YMMV.

重新阅读您的问题,您可能会更具体地询问如何在断言通过时调用您的自定义方法,而不是在断言失败时。在那种情况下,实验方法 pytest_assertion_pass 可能是您正在寻找的东西。设置是相同的,只需在您的 conftest.py 中实现该方法即可。 .

关于python - 断言改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64898835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com