2

代码的功能测试通常需要外部资源,例如数据库。

基本上有两种方法:

  • 假设资源(例如数据库)始终在运行并且始终可用
  • 作为测试的一部分启动/停止相关资源

在 Python unittest(2) 的“旧”世界中,setUp() 和 tearDown() 方法可用于控制服务。

使用 py.test,世界变得更加复杂,setUp() 和 tearDown() 方法的概念已被用于实现夹具的 funcarg 魔法所取代。老实说,这种方法被打破了——至少作为 setUp/tearDown 方法的替代品。

在使用 py.test 的项目中控制服务和资源的推荐方法是什么?

我们应该继续使用 setUp/tearDown 方法编写测试(至少在需要的地方)还是有更好的模式?

4

2 回答 2

1

pytest 支持 xUnit 风格的设置/拆卸方法,请参阅http://pytest.org/latest/xunit_setup.html所以如果你喜欢这种风格,你可以使用它。

使用http://pytest.org/latest/fixture.html还可以实例化一个“会话”范围的夹具,它可以实例化整个测试运行的外部进程并返回一个连接对象。代码大致如下所示:

# content of conftest.py

import pytest

@pytest.fixture(scope="session")
def connection():
    ... instantiate process ...
    return connection_to_process_or_url

并像这样使用它测试文件:

# content of test_conn.py
def test_conn_ok(connection):
    ... work with connection ...

如果您想在测试运行之间保持服务,您将需要暂时自己编写一些逻辑(存储 PID,检查它是否存在,如果没有 PID 或不存在,则启动一个新进程)(未来的版本可能包括这样的支持代码)。

于 2013-01-12T23:51:42.677 回答
1

正如hpk42 指出的那样,在 pytest 中执行此操作的正确方法似乎是使用会话范围的固定装置。根据文档的 Fixture finalization / execution teardown code 部分,您可以使用yield语句简洁地将 setup/teardown 内联到单个调用中:

import smtplib
import pytest

@pytest.fixture(scope="module")
def smtp(request):
    smtp = smtplib.SMTP("smtp.gmail.com")
    yield smtp  # provide the fixture value
    print("teardown smtp")
    smtp.close()

在这种情况下,如果您不希望它按模块运行,则可以使用会话范围。

于 2016-09-19T10:20:20.777 回答