Skip to content
Bootstrap multiprocess tests in django project
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
ptest
testing
.gitignore
README.rst
manage.py
nose2.cfg
requirements.txt

README.rst

Bootstrap multiprocess tests

NB: Support transaction tests only.

Tested with postgresql and sqlite. Look at DATABASES in "ptest/settings.py".

Run test with multiprocess via nose, nose2 or pytest.

Example of using different runner:

# pytest
$ ./manage.py pytest testing/tests/test_v1.py -n3

# nose
$ ./manage.py nose testing/tests/test_v1.py -N3
$ ./manage.py nose testing.tests.test_v1 --processes=3
$ ./manage.py nose testing --processes=3 --process-timeout=300

# nose2
$ ./manage.py nose2 testing.tests.test_v1 --processes=3

Used little bit of code for that:

$ ll testing
    4.0K management/
    4.0K tests/
     428 __init__.py
    1.7K cases.py

$ ll testing/management/commands/
      0 __init__.py
    191 nose.py
    211 nose2.py
    195 pytest.py

Warning: Need to improve nose and nose2 support.

Example of pytest command:

### testing/__init__.py ###
import os
from contextlib import contextmanager

from django.db import connection
from django.test.utils import setup_test_environment, teardown_test_environment


@contextmanager
def run_tests():
    os.environ['DJANGO_SETTINGS_MODULE'] = 'ptest.settings'
    setup_test_environment()
    connection.creation.create_test_db(verbosity=0, autoclobber=True)
    try:
        yield
    finally:
        teardown_test_environment()


### testing/management/commands/pytest.py ###
from testing import run_tests


class Command(object):
    option_list = []

    def run_from_argv(self, argv):
        import pytest

        with run_tests():
            pytest.main(argv[2:])

Some measurements

Repository has some synthetic tests in "testing/tests" for trying.

System configuration
Intel Core i5-3210M, SSD, Mem~8G
Kernel~3.10.5-1-ARCH x86_64

PostgreSQL 9.2.4; fsync=off
Python 3.3.2
Django 1.5.3

With PostgreSQL

Try only 24 tests:

# 1 process
$ ./manage.py pytest testing/tests/test_v1.py
    14.26s user 0.12s system 95% cpu 15.059 total
$ ./manage.py nose testing.tests.test_v1
    14.21s user 0.12s system 95% cpu 14.995 total
$ ./manage.py nose2 testing.tests.test_v1
    14.31s user 0.06s system 95% cpu 15.041 total

# 3 process
$ ./manage.py pytest testing/tests/test_v1.py -n3
    10.05s user 0.12s system 76% cpu 13.356 total
$ ./manage.py nose testing.tests.test_v1 --processes=3 --process-timeout=300
    15.76s user 0.16s system 122% cpu 12.968 total
$ ./manage.py nose2 testing.tests.test_v1 --processes=3
    15.46s user 0.12s system 130% cpu 11.942 total

Try on all 216 tests:

# 1 process
$ ./manage.py pytest testing
    122.77s user 0.56s system 97% cpu 2:06.26 total
$ ./manage.py nose testing
    123.16s user 0.52s system 97% cpu 2:06.48 total
$ ./manage.py nose2 testing
    122.16s user 0.60s system 97% cpu 2:05.57 total

# 3 process
$ ./manage.py pytest testing -n3
    42.28s user 0.25s system 42% cpu 1:41.26 total
$ ./manage.py nose testing --processes=3 --process-timeout=300
    140.27s user 0.71s system 137% cpu 1:42.53 total
$ ./manage.py nose2 testing --processes=3
    133.31s user 0.59s system 128% cpu 1:44.03 total

# 2 process
$ ./manage.py pytest testing -n2
    65.44s user 0.38s system 64% cpu 1:41.59 total

# 4 process
$ ./manage.py pytest testing -n4
    42.87s user 0.26s system 41% cpu 1:42.90 total

# 5 process
$ ./manage.py pytest testing -n5
    28.73s user 0.20s system 28% cpu 1:42.65 total

With SQLite

Try on all 216 tests:

# 1 process
./manage.py pytest testing
    120.49s user 0.39s system 100% cpu 2:00.75 total
$ ./manage.py nose testing
    122.29s user 0.30s system 100% cpu 2:02.45 total
$ ./manage.py nose2 testing
    123.15s user 0.38s system 100% cpu 2:03.39 total

# 4 process
$ ./manage.py pytest testing -n4
    61.37s user 0.29s system 96% cpu 1:03.58 total
$ ./manage.py nose testing --processes=4
    246.00s user 0.85s system 383% cpu 1:04.41 total
$ ./manage.py nose2 testing -N4
    197.82s user 0.57s system 305% cpu 1:04.86 total

# 3 process
$ ./manage.py pytest testing -n3
    65.42s user 0.27s system 99% cpu 1:06.29 total

# 2 process
$ ./manage.py pytest testing -n2
    67.34s user 0.25s system 99% cpu 1:07.91 total

Maybe need more measurements, but even these results give us good starting point for understanding.

You can’t perform that action at this time.