42

py.test 在哪里以及如何查找固定装置?我在同一个文件夹中的 2 个文件中有相同的代码。当我删除 conftest.py 时,找不到运行 test_conf.py 的 cmdopt(也在同一个文件夹中。为什么没有搜索到 sonoftest.py?

# content of test_sample.py
def test_answer(cmdopt):
    if cmdopt == "type1":
        print ("first")
    elif cmdopt == "type2":
        print ("second")
    assert 0 # to see what was printed

conftest.py 的内容

import pytest

def pytest_addoption(parser):
    parser.addoption("--cmdopt", action="store", default="type1",
        help="my option: type1 or type2")

@pytest.fixture
def cmdopt(request):
    return request.config.getoption("--cmdopt")

sonoftest.py 的内容

import pytest

def pytest_addoption(parser):
    parser.addoption("--cmdopt", action="store", default="type1",
        help="my option: type1 or type2")

@pytest.fixture
def cmdopt(request):
    return request.config.getoption("--cmdopt")

文档说

http://pytest.org/latest/fixture.html#fixture-function

  1. 由于 test_ 前缀,pytest 找到了 test_ehlo。测试函数需要一个名为 smtp 的函数参数。通过查找名为 smtp 的带有夹具标记的函数来发现匹配的夹具函数。
  2. smtp() 被调用来创建一个实例。
  3. test_ehlo() 在测试函数的最后一行被调​​用并失败。
4

3 回答 3

36

默认情况下, py.test 将导入与模式conftest.py匹配的所有 Python 文件。如果你有一个测试夹具,你需要从依赖它的测试文件中包含或导入它:python_filestest_*.pyconftest.py

from sonoftest import pytest_addoption, cmdopt
于 2012-11-30T10:17:24.343 回答
23

这是 py.test 查找固定装置(和测试)的顺序和位置(取自此处):

py.test 在工具启动时通过以下方式加载插件模块:

  1. 通过加载所有内置插件

  2. 通过加载通过 setuptools 入口点注册的所有插件。

  3. 通过预先扫描命令行中的-p name选项并在实际命令行解析之前加载指定的插件。

  4. 通过加载conftest.py命令行调用推断的所有文件(测试文件及其所有父目录)。请注意, conftest.py默认情况下,子目录中的文件不会在工具启动时加载。

  5. 通过递归加载conftest.py文件中 pytest_plugins 变量指定的所有插件

于 2012-12-03T15:19:40.073 回答
4

我遇到了同样的问题并花了很多时间寻找一个简单的解决方案,这个例子适用于与我有类似情况的其他人。

  • conftest.py:
import pytest

pytest_plugins = [
 "some_package.sonoftest"
]

def pytest_addoption(parser):
  parser.addoption("--cmdopt", action="store", default="type1",
      help="my option: type1 or type2")

@pytest.fixture
def cmdopt(request):
  return request.config.getoption("--cmdopt")
  • some_package/sonoftest.py:
import pytest

@pytest.fixture
def sono_cmdopt(request):
  return request.config.getoption("--cmdopt")
  • some_package/test_sample.py
def test_answer1(cmdopt):
  if cmdopt == "type1":
      print ("first")
  elif cmdopt == "type2":
      print ("second")
  assert 0 # to see what was printed

def test_answer2(sono_cmdopt):
  if sono_cmdopt == "type1":
      print ("first")
  elif sono_cmdopt == "type2":
      print ("second")
  assert 0 # to see what was printed

您可以在此处找到类似的示例:https ://github.com/pytest-dev/pytest/issues/3039#issuecomment-464489204 和其他此处https://stackoverflow.com/a/54736376/6655459

来自官方 pytest 文档的描述:https ://docs.pytest.org/en/latest/reference.html?highlight=pytest_plugins#pytest-plugins

请注意,引用的各个目录 some_package.test_sample"需要有__init__.py文件供插件加载pytest

于 2019-02-17T18:19:14.833 回答