跳转到主要内容

为pytest扩展的服务器固定装置

项目描述

Pytest服务器固定装置

此库提供了一个可扩展的框架,在测试中运行真正的网络服务器,并提供了一套针对一些知名网络服务和数据库的固定装置。

目录

电池包含

测试夹具

额外依赖名称

MongoDB

mongodb

Postgres

postgres

Redis

redis

RethinkDB

rethinkdb

S3 Minio

s3

Apache Httpd

简单HTTP服务器

Jenkins

jenkins

Xvfb (X-Windows虚拟帧缓冲区)

注意:v2测试夹具支持本地启动、在Docker容器中或作为Kubernetes Pod启动(见配置

安装

此软件包的安装取决于您想使用其哪些部分。它使用可选依赖项(如上表所示)以减少所需的第三方软件包数量。这样,如果您不使用MongoDB,则不需要安装PyMongo。

# Install with support for just mongodb
pip install pytest-server-fixtures[mongodb]

# Install with support for mongodb and jenkins
pip install pytest-server-fixtures[mongodb,jenkins]

# Install with Docker support
pip install pytest-server-fixtures[docker]

# Install with Kubernetes support
pip install pytest-server-fixtures[kubernetes]

# Install with only core library and support for httpd and xvfp
pip install pytest-server-fixtures

在测试或conftest.py中明确启用测试夹具(使用setuptools入口点时不需要)

pytest_plugins = ['pytest_server_fixtures.httpd',
                  'pytest_server_fixtures.jenkins',
                  'pytest_server_fixtures.mongo',
                  'pytest_server_fixtures.postgres',
                  'pytest_server_fixtures.redis',
                  'pytest_server_fixtures.rethink',
                  'pytest_server_fixtures.xvfb',
                  ]

配置

测试夹具使用以下环境变量进行配置

设置

描述

默认值

SERVER_FIXTURES_HOSTNAME

服务器监听的名称主机

当前默认名称主机

SERVER_FIXTURES_DISABLE_HTTP_PROXY

在发起HTTP请求时禁用shell环境中设置的任何HTTP代理

True

SERVER_FIXTURES_SERVER_CLASS

用于运行测试夹具的服务器类,从threaddockerkubernetes中选择

thread

SERVER_FIXTURES_K8S_NAMESPACE

(仅限Kubernetes)指定用于启动测试夹具的Kubernetes命名空间。

None(与测试主机相同)

SERVER_FIXTURES_K8S_LOCAL_TEST

(仅限Kubernetes)设置为True以允许运行集成测试(见集成测试)。

False

SERVER_FIXTURES_MONGO_BIN

mongod可执行文件的绝对路径

“”(依赖于通过$PATH访问mongod)

SERVER_FIXTURES_MONGO_IMAGE

(仅限Docker)mongo的Docker镜像

mongo:3.6

SERVER_FIXTURES_PG_CONFIG

Postgres pg_config可执行文件

pg_config

SERVER_FIXTURES_REDIS

Redis服务器可执行文件

redis-server

SERVER_FIXTURES_REDIS_IMAGE

(仅限Docker)redis的Docker镜像

redis:5.0.2-alpine

SERVER_FIXTURES_RETHINK

RethinkDB服务器可执行文件

rethinkdb

SERVER_FIXTURES_RETHINK_IMAGE

(仅限Docker)rethinkdb的Docker镜像

rethink:2.3.6

SERVER_FIXTURES_HTTPD

Httpd服务器可执行文件

apache2

SERVER_FIXTURES_HTTPD_MODULES

Httpd模块目录

/usr/lib/apache2/modules

SERVE R_FIXTURES_JAVA

用于运行Jenkins服务器的Java可执行文件

java

SERVER_FIXTURES_JENKINS_WAR

用于运行Jenkins的.war文件

/usr/share/jenkins/jenkins.war

SERVE R_FIXTURES_XVFB

Xvfb服务器可执行文件

Xvfb

常见固定装置属性

所有这些测试夹具都遵循在唯一端口上启动服务器,然后在测试夹具卸载时终止服务器和清理的模式。

所有测试夹具在运行时共享以下属性

属性

描述

hostname

服务器监听的名称主机

port

服务器监听的端口号

dead

True/False:我死了吗?

workspace

服务器运行的临时目录的`path <https://path.readthedocs.io/>`__对象

MongoDB

mongo模块包含以下测试夹具

测试夹具名称

描述

mongo_server

函数作用域的MongoDB服务器

mongo_server_sess

会话作用域的MongoDB服务器

mongo_server_cls

类作用域的MongoDB服务器

所有这些测试夹具都有以下属性

属性

描述

api

连接到运行服务器的pymongo.MongoClient

以下是如何启动这些服务器之一的示例

def test_mongo(mongo_server):
    db = mongo_server.api.mydb
    collection = db.test_coll
    test_coll.insert({'foo': 'bar'})
    assert test_coll.find_one()['foo'] == 'bar'

Postgres

postgres模块包含以下测试夹具

测试夹具名称

描述

postgres_server_sess

会话作用域的Postgres服务器

PostgreSQL服务器配置具有以下属性

属性

描述

connect()

返回一个连接到服务器的原始psycopg2连接对象

connection_config

返回一个包含连接所需所有数据的字典

您可能希望在会话作用域配置上构建另一个配置;例如

def create_full_schema(connection):
    """Create the database schema"""
    pass

@pytest.fixture(scope='session')
def db_config_sess(postgres_server_sess: PostgresServer) -> PostgresServer:
    """Returns a DbConfig pointing at a fully-created db schema"""
    server_cfg = postgres_server_sess.connection_config
    create_full_schema(postgres_server_sess.connect())
    return postgres_server_sess

Redis

redis模块包含以下配置

测试夹具名称

描述

redis_server

函数作用域的Redis服务器

redis_server_sess

会话作用域的Redis服务器

所有这些测试夹具都有以下属性

属性

描述

api

连接到运行服务器的redis.Redis客户端

以下是如何启动这些服务器之一的示例

def test_redis(redis_server):
    redis_server.api.set('foo': 'bar')
    assert redis_server.api.get('foo') == 'bar'

S3 Minio

s3模块包含以下配置

测试夹具名称

描述

s3_server

会话作用域的S3服务器,使用‘minio’工具。

s3_bucket

函数作用域的S3存储桶

S3服务器具有以下属性

属性

描述

get_s3_client()

返回boto3 Resourceboto3.resource('s3', ...)

S3存储桶具有以下属性

属性

描述

name

存储桶名称,一个UUID

client

来自服务器的boto3 Resource

以下是如何启动这些服务器之一的示例

def test_connection(s3_bucket):
    bucket = s3_bucket.client.Bucket(s3_bucket.name)
    assert bucket is not None

RethinkDB

rethink模块包含以下配置

测试夹具名称

描述

rethink_server

函数作用域的Redis服务器

rethink_server_sess

会话作用域的Redis服务器

rethink_unique_db

会话作用域的唯一数据库

rethink_module_db

模块作用域的唯一数据库

rethink_make_tables

模块作用域配置,用于创建命名表

rethink_empty_db

函数作用域配置,用于清空rethink_make_tables中创建的表

服务器配置具有以下属性

属性

描述

conn

rethinkdb.Connection连接到运行服务器上的test数据库

以下是如何启动这些服务器之一的示例

def test_rethink(rethink_server):
    conn = rethink_server.conn
    conn.table_create('my_table').run(conn)
    inserted = conn.table('my_table').insert({'foo': 'bar'}).run(conn)
    assert conn.get(inserted.generated_keys[0])['foo'] == 'bar

创建表

您可以为模块中的每个测试创建表,如下所示

FIXTURE_TABLES = ['accounts','transactions']

def test_table_creation(rethink_module_db, rethink_make_tables):
    conn = rethink_module_db
    assert conn.table_list().run(conn) == ['accounts', 'transactions']

清空数据库

RehinkDb创建表的性能通常比清空它们慢(至少在编写本文时是这样),因此我们有一个配置,可以在测试之间清空使用上述rethink_make_tables配置创建的表

FIXTURE_TABLES = ['accounts','transactions']

def test_put_things_in_db(rethink_module_db, rethink_make_tables):
    conn = rethink_module_db
    conn.table('accounts').insert({'foo': 'bar'}).run(conn)
    conn.table('transactions').insert({'baz': 'qux'}).run(conn)


def test_empty_db(rethink_empty_db):
    conn = rethink_empty_db
    assert not conn.table('accounts').run(conn)
    assert not conn.table('transactions').run(conn)

Apache httpd

httpd模块包含以下配置

测试夹具名称

描述

httpd_server

用于作为Web代理的函数作用域httpd服务器

该配置在运行时具有以下属性

属性

描述

document_root

path.path到文档根目录

log_dir

path.path到日志目录

以下是一个示例,展示了该配置的一些功能

def test_httpd(httpd_server):
    # Log files can be accessed by the log_dir property
    assert 'access.log' in [i.basename() for i in httpd_server.log_dir.files()]

    # Files in the document_root are accessable by HTTP
    hello = httpd_server.document_root / 'hello.txt'
    hello.write_text('Hello World!')
    response = httpd_server.get('/hello.txt')
    assert response.status_code == 200
    assert response.text == 'Hello World!'

代理规则

一个独立的httpd服务器本身不是很实用,因此该配置的底层类提供了配置它作为反向代理的选项。以下是一个示例,其中我们引入了一个pytest-pyramid配置,并将其设置为通过httpd服务器代理

import pytest
from pytest_server_fixtures.httpd import HTTPDServer

pytest_plugins=['pytest_pyramid']

@pytest.yield_fixture()
def proxy_server(pyramid_server):

    # Configure the proxy rules as a dict of source -> dest URLs
    proxy_rules = {'/downstream/' : pyramid_server.url
                  }

    server = HTTPDServer(proxy_rules,
                         # You can also specify any arbitrary text you want to
                         # put in the config file
                         extra_cfg = 'Alias /tmp /var/tmp\n',
                         )
    server.start()
    yield server
    server.teardown()

def test_proxy(proxy_server):
    # This request will be proxied to the pyramid server
    response = proxy_server.get('/downstream/accounts')
    assert response.status_code == 200

简单HTTP服务器

http模块包含以下配置

测试夹具名称

描述

simple_http_server

Python的SimpleHTTPServer的函数作用域实例

该配置在运行时具有以下属性

属性

描述

document_root

path.path到文档根目录

以下是一个示例,展示了该配置的一些功能

def test_simple_server(simple_http_server):
    # Files in the document_root are accessable by HTTP
    hello = simple_http_server.document_root / 'hello.txt'
    hello.write_text('Hello World!')
    response = simple_http_server.get('/hello.txt')
    assert response.status_code == 200
    assert response.text == 'Hello World!'

Jenkins

jenkins模块包含以下配置

测试夹具名称

描述

jenkins_server

会话作用域的Jenkins服务器实例

该配置具有以下方法和属性

属性

描述

api

jenkins.Jenkins API客户端连接到运行服务器(见https://python-jenkins.readthedocs.org)

load_plugins()

从目录中加载插件到服务器

以下是如何启动服务器的示例

PLUGIN_DIR='/path/to/some/plugins'

def test_jenkins(jenkins_server):
    jenkins_server.load_plugins(PLUGIN_DIR)
    assert not jenkins_server.api.get_jobs()

Xvfb

xvfb模块包含以下配置

测试夹具名称

描述

xvfb_server

函数作用域的Xvfb服务器

xvfb_server_sess

会话作用域的Xvfb服务器

该配置具有以下属性

属性

描述

display

X-windows DISPLAY变量

以下是如何启动服务器的示例

def test_xvfb(xvfb_server):
    assert xvfb_server.display

服务器框架

所有包含的配置和其他此插件套件中的配置都是建立在可扩展的TCP服务器运行框架之上,因此它们共享各种属性和方法。

pytest_shutil.workspace.Workspace
  |
  *--base2.TestServerV2
     |
     *--mongo.MongoTestServer
     *--redis.RedisTestServer
     *--rethink.RethinkDBServer
  *--base.TestServer
     |
     *--http.HTTPTestServer
        |
        *--http.SimpleHTTPTestServer
        *--httpd.HTTPDServer
        *--jenkins.JenkinsTestServer
        *--pytest_pyramid.PyramidTestServer

类方法

了解框架的最好方法是通过查看代码,但这里是对基类base.TestServer的子类可以重写的类方法的快速总结。

方法

描述

pre_setup

这个方法应在启动服务器之前执行任何必要的设置

run_cmd(必需)

这个方法应返回启动服务器所需的shell命令列表

run_stdin

这个方法的输出传递给进程作为stdin

check_server_up(必需)

调用此方法以查看服务器是否正在运行

post_setup

这个方法应在启动服务器后执行任何必要的设置

类属性

至少,子类必须定义run_cmdcheck_server_up。还有一些类属性可以被重写以修改服务器行为

属性

描述

默认值

random_port

在保证唯一的随机TCP端口上启动服务器

True

port_seed

如果random_port为false,端口号是半可重复的,基于类名和此种子的哈希

65535

kill_signal

用于杀死服务器的信号

SIGTERM

kill_retry_delay

在杀死重试之间的秒数。如果服务器死亡需要较长时间,则增加此值

1

构造函数参数

基类构造函数也接受这些参数

参数

描述

port

显式设置端口号

hostname

显式设置主机名

env

传递给服务器进程的shell环境字典

cwd

覆盖服务器进程的当前工作目录

集成测试

$ vagrant up
$ vagrant ssh
...
$ . venv/bin/activate
$ cd /vagrant
$ make develop
$ cd pytest-server-fixtures

# test serverclass="thread"
$ pytest

# test serverclass="docker"
$ SERVER_FIXTURES_SERVER_CLASS=docker pytest

# test serverclass="kubernetes"
$ SERVER_FIXTURES_SERVER_CLASS=kubernetes SERVER_FIXTURES_K8S_LOCAL_TEST=True pytest

变更日志

1.7.0

  • 所有:支持pytest >= 4.0.0

  • 所有:支持Python 3.7

  • pytest-server-fixtures:如果您的机器上未定义主机,则默认为主机localhost

  • pytest-server-fixture:由于上游API更改,将rethinkdb固定为< 2.4.0

  • pytest-verbose-parametrize:添加对改进的标记基础设施的支持

  • pytest-verbose-parametrize:修复集成测试以支持pytest >= 4.1.0

  • pytest-virtualenv:将virtualenv添加为安装要求。修复#122

  • pytest-webdriver:使用getfixturevalue修复RemovedInPytest4Warning

  • circleci:通过跳过对没有推送访问权限的开发者的coverall提交来修复检查

  • wheels:生成既适用于python 2.x也适用于3.x的通用wheels安装包

  • dist:移除对构建和分发*.egg文件的支持

  • VagrantFile:默认安装python 3.7并初始化python 3.7

  • 使用“logger.warning()”函数修复DeprecationWarning警告

1.6.2 (2019-02-21)

  • pytest-server-fixtures:如果调用kill(),则抑制堆栈跟踪

  • pytest-server-fixtures:修复TestServerV2中随机端口逻辑

1.6.1 (2019-02-12)

  • pytest-server-fixtures:修复在服务器未启动时尝试访问主机名的异常

1.6.0 (2019-02-12)

  • pytest-server-fixtures:添加之前删除的TestServerV2.kill()函数

  • pytest-profiling:在集成测试中将more-itertools固定为5.0.0,因为这是一个仅限PY3的版本

1.5.1 (2019-01-24)

  • pytest-verbose-parametrize:修复使用@pytest.mark.parametrize时的Unicode参数

1.5.0 (2019-01-23)

  • pytest-server-fixtures:使postgres fixture及其测试成为可选的,就像所有其他fixture一样

  • pytest-server-fixtures:撤销对pymongo弃用警告的修复,因为这会破坏与pymongo 3.6.0的兼容性

  • pytest-server-fixtures:在httpd中删除RHEL5支持

1.4.1 (2019-01-18)

  • pytest-server-fixtures:现在只有服务器类“thread”受ENV中指定的服务器fixture二进制路径的影响

1.4.0 (2019-01-15)

  • 修复Simple HTTP Server fixture中的python 3兼容性

  • 修复pytest-profiling中的损坏测试

  • 将pytest<4.0.0固定,直到所有弃用警告都得到修复。

  • pytest-webdriver:用无头Google Chrome替换了已弃用的phantomjs。

  • 将Vagrantfile添加到项目中,以便使测试环境可移植。

  • 将.editorconfig文件添加到项目中。

  • pytest-server-fixtures:添加支持Docker和Kubernetes的TestServerV2。

  • pytest-server-fixtures:修复MinioServer使用后未清理的问题。

  • pytest-server-fixtures:修复调用pymongo时的弃用警告。

  • pytest-server-fixtures: 在MongoTestServer析构时关闭pymongo客户端。

  • pytest-server-fixtures: 将Mongo、Redis和RethinkDB升级到TestServerV2。

  • coveralls: 修复损坏的coveralls

1.3.1 (2018-06-28)

  • 使用pymongo list_database_names()代替已弃用的database_names(),添加pymongo >= 3.6.0依赖项

1.3.0 (2017-11-17)

  • 修复了当teardown为None时的工作空间删除问题

  • 修复了pytest-listener中root logger的squash问题

  • 添加了S3 Minio fixture(多谢Gavin Bisesi的贡献)

  • 添加了Postgres fixture(多谢Gavin Bisesi的贡献)

  • 使用requests进行服务器fixture的http get,因为它正确处理重定向和代理

1.2.12 (2017-8-1)

  • 修复了缓存临时主机名的回归,一些客户端依赖于此。现在这是可选的。

1.2.11 (2017-7-21)

  • 修复了OSX绑定到非法本地IP范围的问题(感谢Gavin Bisesi)

  • 为pytest-profiling设置和Py3k修复(感谢xoviat)

  • 当预留本地IP主机时,不再尝试绑定端口5000,因为有人可能已将其绑定到0.0.0.0

  • 修复了#46在本地虚拟环境未激活时source gprof2dot的问题

1.2.10 (2017-2-23)

  • 处理pytest-webdriver中的自定义Pytest测试项

1.2.9 (2017-2-23)

  • 将用户名添加到mongo服务器fixture的tempdir路径中,以防止在共享多用户文件系统上发生冲突

1.2.8 (2017-2-21)

  • 在shutil.run.run_as_main中返回函数结果

1.2.7 (2017-2-20)

  • 对path.py的旧版本进行更多处理

  • 允许在pytest-virtualenv中传递virtualenv参数

1.2.6 (2017-2-16 )

  • 更新devpi服务器设置以支持devpi-server >= 2.0

  • 随机端口选择改进

  • 默认情况下,HTTPD服务器绑定到0.0.0.0,以帮助Selenium风格的测试

  • 更新mongodb服务器参数以支持mongodb >= 3.2

  • 对mongodb fixture配置进行纠正并改进启动逻辑

  • 添加模块作用域的mongodb fixture

  • 处理path.py的旧版本

  • 修复了#40中chdir会破坏pytest-profiling的问题

1.2.5 (2016-12-09)

  • 改进服务器运行器主机和端口生成,现在支持随机本地IP

  • RethinkDB fixture配置的bug修复

1.2.4 (2016-11-14)

  • pymongo额外依赖项的bug修复

  • pytest-virtualenv的Windows兼容性修复(感谢Jean-Christophe Fillion-Robin的PR)

  • 修复pytest-shutil.cmdline.get_real_python_executable的symlink处理

1.2.3 (2016-11-7)

  • 提高Mongo fixture启动检查的健壮性

1.2.2 (2016-10-27)

  • 大多数模块的Python 3兼容性

  • 修复了过时的Path.py导入(感谢Bryan Moscon)

  • 修复了pytest-profiling中过时的multicall(感谢Paul van der Linden的PR)

  • 添加devpi-server fixture以创建每个测试函数的索引

  • 添加缺少的许可文件

  • 拆分httpd服务器fixture配置,以便子类可以更容易地覆盖已加载的模块

  • 在TestServer基类中添加了'preserve_sys_path'参数,该参数将当前的python sys.path导出到子进程。

  • 更新httpd、redis和jenkins的运行时参数和路径到当前的Ubuntu规范

  • 在拆卸工作空间时忽略错误,以避免shutil.rmtree实现中的竞争条件

1.2.1 (2016-3-1)

  • 修复了最新版本的pytest的pytest-verbose-parametrize

1.2.0 (2016-2-19)

  • 新插件:git仓库fixture

1.1.1 (2016-2-16)

  • pytest-profiling改进:在.prof文件中转义非法字符(感谢Aarni Koskela的PR)

1.1.0 (2016-2-15)

  • 新插件:devpi服务器fixture

  • pytest-profiling改进:过长的.prof文件保存为测试名称的短哈希(感谢Vladimir Lagunov的PR)

  • 出于安全原因,将workspace.run()的默认行为更改为不使用子shell

  • 正确修正virtualenv.run()方法以处理与父方法workspace.run()相同的参数

  • 从virtualenv参数中移除了过时的‘–distribute’

1.0.1 (2015-12-23)

  • 打包bug修复

1.0.0 (2015-12-21)

  • 首次公开发布

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

pytest-server-fixtures-1.7.1.tar.gz (9.8 MB 查看哈希值)

上传时间 源代码

构建分发

pytest_server_fixtures-1.7.1-py2.py3-none-any.whl (39.8 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下组织支持