测试代码是否在py.test会话中执行

时间:2014-08-07 16:56:37

标签: python pytest

如果我的代码在py.test下运行,我想连接到不同的数据库。是否有一个可以调用的函数或一个我可以测试的环境变量,它会告诉我是否在py.test会话下运行?处理这个问题的最佳方法是什么?

6 个答案:

答案 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')