Skip to main content
https://raw.githubusercontent.com/ClearcodeHQ/pytest-mysql/master/logo.png

pytest-mysql

Latest PyPI version Wheel Status Supported Python Versions License

What is this?

This is a pytest plugin, that enables you to test your code that relies on a running MySQL Database. It allows you to specify fixtures for MySQL process and client.

How to use

Plugin contains two fixtures

  • mysql - it’s a client fixture that has functional scope. After each test drops test database from MySQL ensuring repeatability.

  • mysql_proc - session scoped fixture, that starts MySQL instance at it’s first use and stops at the end of the tests.

  • mysql_noproc - session scoped fixtures, that allows to connect to already existing MySQL instance, and cleans the database at the end of the tests

Simply include one of these fixtures into your tests fixture list.

You can also create additional mysql client and process fixtures if you’d need to:

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')

Configuration

You can define your settings in three ways, it’s fixture factory argument, command line option and pytest.ini configuration option. You can pick which you prefer, but remember that these settings are handled in the following order:

  • Fixture factory argument

  • Command line option

  • Configuration option in your pytest.ini file

Configuration options

MySQL/MariaDB option

Fixture factory argument

Command line option

pytest.ini option

Noop process fixture

Default

Path to executable

mysqld_exec

–mysql-mysqld

mysql_mysqld

mysqld

Path to safe executable

mysqld_safe

–mysql-mysqld-safe

mysql_mysqld_safe

mysqld_safe

Path to mysql_install_db for legacy installations

install_db

–mysql-install-db

mysql_install_db

mysql_install_db

Path to Admin executable

admin_executable

–mysql-admin

mysql_admin

mysqladmin

Database hostname

host

–mysql-host

mysql_host

yes

localhost

Database port

port

–mysql-port

mysql_port

yes (3306)

random

MySQL user to work with

user

–mysql-user

mysql_user

root

User’s password

passwd

–mysql-passwd

mysql_passwd

Test database name

dbname

–mysql-dbname

mysql_dbname

test

Starting parameters

params

–mysql-params

mysql_params

Log directory location [DEPRECATED]

logsdir

–mysql-logsdir

mysql_logsdir

$TMPDIR

Example usage:

  • pass it as an argument in your own fixture

    mysql_proc = factories.mysql_proc(
        port=8888)
  • use --mysql-port command line option when you run your tests

    py.test tests --mysql-port=8888
  • specify your port as mysql_port in your pytest.ini file.

    To do so, put a line like the following under the [pytest] section of your pytest.ini:

    [pytest]
    mysql_port = 8888

Examples

Populating database for tests

With SQLAlchemy

This example shows how to populate database and create an SQLAlchemy’s ORM connection:

Sample below is simplified session fixture from pyramid_fullauth tests:

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

Connecting to MySQL/MariaDB (in a docker)

To connect to a docker run MySQL and run test on it, use noproc fixtures.

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

This will start MySQL in a docker container, however using a MySQL installed locally is not much different.

In tests, make sure that all your tests are using mysql_noproc fixture like that:

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()

And run tests:

pytest --mysql-host=127.0.0.1

Running on Docker/as root

Unfortunately, running MySQL as root (thus by default on docker) is not possible. MySQL (and MariaDB as well) will not allow it.

USER nobody

This line should switch your docker process to run on user nobody. See this comment for example

Package resources

Release

Install pipenv and –dev dependencies first, Then run:

pipenv run tbump [NEW_VERSION]

Metadata

Release files for pytest-mysql 2.4.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pytest-mysql 2.4.1
File Size Uploaded
pytest-mysql-2.4.1.tar.gz 19.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pytest-mysql 2.4.1
File Interpreter ABI Platform
pytest_mysql-2.4.1-py3-none-any.whl Python 3 none any Details

Total release size: 36.4 kB

Release files / pytest-mysql-2.4.1.tar.gz

Download URL pytest-mysql-2.4.1.tar.gz
Size 19.8 kB
Tags Source
SHA-256 checksum
How to use checksums
0f3a6d7e44b7941064119a8de69a08c4bd7c6f8835675f7145d0851390183a3f
BLAKE2b-256 checksum
How to use checksums
3809cce44163ba0532b04cf9259fa212c6b47e697ca5c122498080f156c8ced4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.11.2

Release files / pytest_mysql-2.4.1-py3-none-any.whl

Download URL pytest_mysql-2.4.1-py3-none-any.whl
Size 16.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fce821a981ad37a8daeef7118eb69c840de309b955835bb16ca7c3cc31c39882
BLAKE2b-256 checksum
How to use checksums
efe3511ec0b90acfb7fe349041d870afd4a885e40d22c9dffdcd0157f6cabd61
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.11.2

Release history Release notifications | RSS feed

5.0.1

2 release files

5.0.0

2 release files

4.0.0

2 release files

3.1.0

2 release files

3.0.0

2 release files

2.5.0

2 release files

2.4.2

2 release files

This release

2.4.1 This release

2 release files

2.4.0

2 release files

2.3.1

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.3

2 release files

2.0.2

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.0.0

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page