跳转到主要内容

pytest的MySQL进程和客户端固定功能

项目描述

https://raw.githubusercontent.com/ClearcodeHQ/pytest-mysql/master/logo.png

pytest-mysql

Latest PyPI version Wheel Status Supported Python Versions License

这是什么?

这是一个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 (37.7 kB 查看哈希)

上传时间

构建分布

pytest_mysql-3.0.0-py3-none-any.whl (34.4 kB 查看哈希)

上传时间 Python 3

由以下提供支持