Pytest-断言重写
1 pytest.register_assert_rewrite-断言重写
pytest
是使用普通的断言语句以及断言失败时表达式的详细内省,仅重写测试模块本身以及作为插件一部分的任何模块,任何其他导入的模块都不会被重写,并且会发生正常的断言行为。
换言之:如果你在其他模块中有断言,你需要启用断言重写,你需要pytest
在导入之前明确要求重写这个模块。
注册一个或多个要在导入时重写的模块名称,此函数将确保此模块或程序包内的所有模块将重写其assert语句。
举个例子:
example.py里面含有assert断言
1 def func(): 2 b = 1 3 assert b == 0
pytest项目 test_func.py 中要导入 example.py 模块中的函数
1 from example import func 2 3 def test_func(): 4 func()
此时运行 python -m pytest -v test_func.py 会产生如下结果,它将不会打印有关断言失败原因的调试信息(即b的值为1)
注意:如果我将 func() 函数定义放在 test_func.py 文件中,则会得到预期的结果
看出两者的区别了吗?在于是否会打印有关断言失败原因的调试信息(即b的值为1)
解决方案:
可以使用 pytest.register_assert_rewrite 函数来为您的模块启用此功能,从模块导入函数之前,必须先调用register_assert_rewrite;可以将其放入conftest.py
1 #----conftest.py 2 import pytest 3 # 导入同级目录example.py 4 pytest.register_assert_rewrite("example") 5 # 导入其他包的模块 6 pytest.register_assert_rewrite("foo.example")
前面有个命令你会发现与平时的 pytest 执行命令不太一样, python -m pytest -v test_func.py ,如果你单纯使用命令 pytest -v test_func.py 执行时将会引发导入模块(找不到模块)的错误。
具体详情请看参考文章【3】
本文参考一下文章:
【3】pytest执行用例时返回异常ModuleNotFoundError: No module named ‘***‘