如果我的代码在py.test下运行,我想连接到不同的数据库。是否有一个可以调用的函数或一个我可以测试的环境变量,它会告诉我是否在py.test会话下运行?处理这个问题的最佳方法是什么?
答案 0 :(得分:25)
我来到一个更简单的解决方案:
import sys
if "pytest" in sys.modules:
...
Pytest runner将始终加载pytest
模块,使其在sys.modules
中可用。
当然,只有当您尝试测试的代码本身不使用pytest
时,此解决方案才有效。
答案 1 :(得分:24)
解决方案来自RTFM,虽然不是一个显而易见的地方。该手册在代码中也有错误,在下面更正。
检测是否在pytest运行中运行
通常,使应用程序代码的行为不同是一个坏主意 如果从测试中调用。但如果你绝对必须找出你的 应用程序代码正在运行,您可以执行类似的测试 这样:
# content of conftest.py def pytest_configure(config): import sys sys._called_from_test = True def pytest_unconfigure(config): import sys # This was missing from the manual del sys._called_from_test
然后检查sys._called_from_test标志:
if hasattr(sys, '_called_from_test'): # called from within a test run else: # called "normally"
相应地在您的申请中。使用自己的也是个好主意 应用程序模块而不是sys用于处理标志。
答案 2 :(得分:5)
手册中还记录了另一种方式: https://docs.pytest.org/en/latest/example/simple.html#pytest-current-test-environment-variable
Pytest将设置以下环境变量PYTEST_CURRENT_TEST
。
检查所述变量的存在应该可靠地使人们能够检测是否正在pytest的保护范围内执行代码。
import os
if "PYTEST_CURRENT_TEST" in os.environ:
# We are running under pytest, act accordingly...
答案 3 :(得分:0)
虽然在另一个答案(http://pytest.org/latest/example/simple.html#detect-if-running-from-within-a-pytest-run)中解释的黑客确实有效,但您可能会以这样的方式设计代码,而不需要这样做。
如果您设计代码以某种方式将数据库作为参数连接,通过连接或其他方式,那么您可以在运行测试时注入不同的参数,然后在应用程序驱动它时。您的代码将以较少的全局状态和更多的模块化和可重用的方式结束。所以对我而言,这听起来像是一个测试驱动你更好地设计代码的例子。
答案 4 :(得分:0)
使用pytest==4.3.1
的上述方法失败了,所以我刚上学并进行了以下检查:
if 'pytest' in sys.argv[0]:
print('pytest was called!')
答案 5 :(得分:0)
这可以通过在测试代码中设置环境变量来完成。例如,给定一个项目
conftest.py
mypkg/
__init__.py
app.py
tests/
test_app.py
在test_app.py
中,您可以添加
import os
os.environ['PYTEST_RUNNING'] = 'true'
然后您可以在app.py
内检查:
import os
if os.environ.get('PYTEST_RUNNING', '') == 'true':
print('pytest is running')