pytest的MySQL进程和客户端固定功能
项目描述
pytest-mysql
这是什么?
这是一个pytest插件,它允许您测试依赖于运行中的MySQL数据库的代码。它允许您指定MySQL进程和客户端的固定功能。
如何使用
插件包含两个固定功能
mysql - 它是一个具有功能范围的客户端配置文件。每次测试后,从MySQL删除测试数据库以确保可重复性。
mysql_proc - 会话范围配置文件,首次使用时启动MySQL实例,测试结束时停止。
mysql_noproc - 会话范围配置文件,允许连接到现有的MySQL实例,并在测试结束时清理数据库。
只需将其中一个配置文件包含到您的测试配置文件列表中。
如果需要,您还可以创建额外的mysql客户端和进程配置文件。
from pytest_mysql import factories
from getpass import getuser()
mysql_my_proc = factories.mysql_proc(
port=None, user=getuser())
mysql_my = factories.mysql('mysql_my_proc')
配置
您可以通过三种方式定义您的设置,它是配置文件工厂参数、命令行选项和pytest.ini配置选项。您可以选择您喜欢的选项,但请记住,这些设置按以下顺序处理
配置文件工厂参数
命令行选项
pytest.ini文件中的配置选项
MySQL/MariaDB选项 |
配置文件工厂参数 |
命令行选项 |
pytest.ini选项 |
Noop进程配置文件 |
默认值 |
---|---|---|---|---|---|
可执行文件路径 |
mysqld_exec |
–mysql-mysqld |
mysql_mysqld |
mysqld |
|
安全可执行文件路径 |
mysqld_safe |
–mysql-mysqld-safe |
mysql_mysqld_safe |
mysqld_safe |
|
mysql_install_db路径(对于旧版安装) |
install_db |
–mysql-install-db |
mysql_install_db |
mysql_install_db |
|
管理可执行文件路径 |
admin_executable |
–mysql-admin |
mysql_admin |
mysqladmin |
|
数据库主机名 |
host |
–mysql-host |
mysql_host |
yes |
localhost |
数据库端口 |
port |
–mysql-port |
mysql_port |
yes (3306) |
random |
要工作的MySQL用户 |
user |
–mysql-user |
mysql_user |
root |
|
用户的密码 |
passwd |
–mysql-passwd |
mysql_passwd |
||
测试数据库名 |
dbname |
–mysql-dbname |
mysql_dbname |
test |
|
启动参数 |
params |
–mysql-params |
mysql_params |
||
日志目录位置[已弃用] |
logsdir |
–mysql-logsdir |
mysql_logsdir |
$TMPDIR |
示例用法
将其作为参数传递给您的自己的配置文件
mysql_proc = factories.mysql_proc( port=8888)
在运行测试时使用--mysql-port命令行选项
py.test tests --mysql-port=8888
在您的pytest.ini文件中将端口号指定为mysql_port。
为此,请将以下行放在您的pytest.ini文件的[pytest]部分下。
[pytest] mysql_port =
8888
示例
为测试填充数据库
使用SQLAlchemy
此示例展示了如何填充数据库并创建SQLAlchemy的ORM连接
以下示例是从pyramid_fullauth测试中简化后的会话配置文件。
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.pool import NullPool
from zope.sqlalchemy import register
@pytest.fixture
def db_session(mysql):
"""Session for SQLAlchemy."""
from pyramid_fullauth.models import Base # pylint:disable=import-outside-toplevel
# assumes setting, these can be obtained from pytest-mysql config or mysql_proc
connection = f'mysql+mysqldb://root:@127.0.0.1:3307/tests?charset=utf8'
engine = create_engine(connection, echo=False, poolclass=NullPool)
pyramid_basemodel.Session = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
pyramid_basemodel.bind_engine(
engine, pyramid_basemodel.Session, should_create=True, should_drop=True)
yield pyramid_basemodel.Session
transaction.commit()
Base.metadata.drop_all(engine)
@pytest.fixture
def user(db_session):
"""Test user fixture."""
from pyramid_fullauth.models import User
from tests.tools import DEFAULT_USER
new_user = User(**DEFAULT_USER)
db_session.add(new_user)
transaction.commit()
return new_user
def test_remove_last_admin(db_session, user):
"""
Sample test checks internal login, but shows usage in tests with SQLAlchemy
"""
user = db_session.merge(user)
user.is_admin = True
transaction.commit()
user = db_session.merge(user)
with pytest.raises(AttributeError):
user.is_admin = False
连接到MySQL/MariaDB(在docker中)
要连接到运行在docker中的MySQL并对其运行测试,请使用noproc配置文件。
docker run --name some-db -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql --expose 3306
docker run --name some-db -e MARIADB_ALLOW_EMPTY_PASSWORD=yes -d mariadb --expose 3306
这将启动docker容器中的MySQL,但与本地安装的MySQL相比,并没有太大区别。
在测试中,确保所有测试都使用类似于以下内容的mysql_noproc配置文件
mysql_in_docker = factories.mysql_noproc()
mysql = factories.mysql("mysql_in_docker")
def test_mysql_docker(mysql):
"""Run test."""
cur = mysql.cursor()
cur.query("CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);")
mysql.commit()
cur.close()
然后运行测试
pytest --mysql-host=127.0.0.1
在Docker中以root身份运行
遗憾的是,以root身份运行MySQL(在docker中默认)是不可能的。MySQL(以及MariaDB)不会允许这样做。
USER nobody
此行应将您的docker进程切换到以nobody用户运行。请参阅此评论的示例。
包资源
版本发布
首先安装pipenv和-dev依赖项,然后运行
pipenv run tbump [NEW_VERSION]
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
pytest_mysql-3.0.0.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a4cca22d1fd8b9c73a0dd5037f6ad0c1886a6d3491c48208507a021b4125d740 |
|
MD5 | 571aa1a358e57d080e97708173c51529 |
|
BLAKE2b-256 | 619740a152917702f2d80801ca28dba37f555b46912cb6cec131808d1eb3f80f |
pytest_mysql-3.0.0-py3-none-any.whl的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 38c5c3d4fe6babd97dc164aad50836050116ad50c58e102f11fedc9c9e8ba1d2 |
|
MD5 | 1079206fffcf4c12c8155c3756ea6a03 |
|
BLAKE2b-256 | bd8da1508d94d662ecceab9a051dbd70f25a9dca48dbcd965eb3e2e6d8aa2b6b |