为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 |
用于运行测试夹具的服务器类,从thread、docker和kubernetes中选择 |
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() |
返回一个连接到服务器的原始 |
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 |
连接到运行服务器的 |
以下是如何启动这些服务器之一的示例
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 |
S3存储桶具有以下属性
属性 |
描述 |
---|---|
name |
存储桶名称,一个UUID |
client |
来自服务器的boto3 |
以下是如何启动这些服务器之一的示例
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 |
函数作用域配置,用于清空 |
服务器配置具有以下属性
属性 |
描述 |
---|---|
conn |
|
以下是如何启动这些服务器之一的示例
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 |
|
log_dir |
|
以下是一个示例,展示了该配置的一些功能
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的 |
该配置在运行时具有以下属性
属性 |
描述 |
---|---|
document_root |
|
以下是一个示例,展示了该配置的一些功能
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 |
|
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 |
以下是如何启动服务器的示例
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_cmd和check_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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c5e733d20a8d0e773ca513e360e4ba2647952ea9428fa2bd05516c6281ea3ce7 |
|
MD5 | 168a3d2b855432eb7b5fc0f772663301 |
|
BLAKE2b-256 | 19d30b6b777827eed2da8e56014ea2002d355d11e28c379a83c750d318a8df43 |
pytest_server_fixtures-1.7.1-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5fe5564deb7d8a6e70bad531dbcb6322b5a8cfee4e874763481519a5e019ce4d |
|
MD5 | 1ef11c4e1b2c6f8a5ce2fa597ea99115 |
|
BLAKE2b-256 | 998aa0cd3dadce789e345986fa942476499b7371d6f098b963f8b82b6d72dd05 |