【问题标题】:Is it possible to use py.test fixtures in doctest files?是否可以在 doctest 文件中使用 py.test 固定装置?
【发布时间】:2012-12-05 11:51:05
【问题描述】:

我们在一个项目中使用 py.test 并在大多数测试用例中使用fixture。但我认为不可能在 doctest 文件中使用固定装置。

举个例子,用一些代码 sn-ps:我在 conftest.py 中有一个浏览器夹具,例如:

@fixture
def browser(request):
    from wsgi_intercept import zope_testbrowser
    browser = zope_testbrowser.WSGI_Browser()
    [...]
    return browser

并在文件 test_browser.txt 中使用它,例如:

>>> browser.open('some_url')
>>> browser.url == 'some_url'
True

但我看不到将夹具放入 doctest 文件的方法。 py.test 有可能吗?

【问题讨论】:

  • 我相信 doctests 应该显示工作示例,因此使用固定装置没有任何意义。如果您将它们用于测试目的而不是记录行为,那么您可能应该将它们转换为单元测试。
  • 我无法真正理解您的观点,为什么这没有意义。是的,文档测试显示了工作示例,在这种情况下作为功能测试。我只想将相同的配置保存在一个中心位置,在我已经用于 unittest 之类的功能测试的夹具中。

标签: python pytest


【解决方案1】:

暂时不支持。 pytest 需要在收集时知道将在 doctest 中使用哪些固定装置。如果我们能想出一种方法来声明将使用哪些fixture,那么添加对_pytest/doctest.py 的支持应该不难。也许还可以自动找出doctest 需要哪些fixture,不确定。

【讨论】:

  • 感谢您的回答。同时我在nose(nose.readthedocs.org/en/latest/…) 中看到了doctest-fixture 选项,并认为它应该是可能的。但现在我知道它还没有实现。
  • 您尝试过nose-doctest-fixture 支持并对此感到满意吗?我认为在 doctest 文本本身中有一个特殊的语法来指定固定装置会很好。我自己目前没有使用 doctest,所以我很乐意提出建议。类似于“.. pytest-fixtures: name1, name2, name3”的行可以在收集时进行预扫描,然后在执行时设置为 doctest 执行时使用的“globs”的一部分。
  • 不,我没试过,只看文档(nose.readthedocs.org/en/latest/doc_tests/test_doctest_fixtures/…)。那里描述的 doctest setup 和 teardown 方法似乎是特定于 doctest 的。如果我正确理解您的建议,我已经拥有的相同装置也可以用于文档测试。因为这是我要找的,所以如果有的话,我最喜欢后者。你认为值得讨论吗?
  • 是的,值得一提。请注意,由于我自己并没有经常使用 doctest,如果您尽可能准确地写下您希望看到的内容,我将不胜感激。当然,保持它最小化会让我或其他人更有可能实现它。请注意,_pytest/doctest.py 不是一个非常大的插件,因此您甚至可以自己尝试一些东西 - 我当然会尝试支持它。
【解决方案2】:

pull request 试图在 pytest repository 上实现此功能。它为 doctest 文件提供了两个全局变量,即 fixture_requestget_fixture(这是 fixture_request.getfuncargvalue 的便捷快捷方式)。预期用途是:

>>> browser = get_fixture('browser')
>>> browser.open('some_url')

这与上面 Holger 所建议的 .. pytest-fixtures: ... 行不同,但更容易实现... :) 不用说,当然可以讨论!

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 2020-04-16
    • 2012-08-22
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多