Django
Fast Tests

Speeding up the tests
Running tests in parallel
As long as your tests are properly isolated, you can run them in parallel to gain a speed up on multi-core hardware.
python mange.py --parallelSpeeding up the tests
Password hashing
The default password hasher is rather slow by design. If you’re authenticating many users in your tests, you may want to use a custom settings file and set the PASSWORD_HASHERS setting to a faster hashing algorithm:
PASSWORD_HASHERS = ['django.contrib.auth.hashers.MD5PasswordHasher',]Speeding up the tests
Preserving the test database
The test --keepdb option preserves the test database between test runs. It skips the create and destroy actions which can greatly decrease the time to run tests.
Putting the settings to test
| manage.py test | Ran 442 tests in 294.374s |
| manage.py test --parallel | Ran 442 tests in 136.189s (2 cpus) |
| manage.py test --parallel --keepdb | Ran 442 tests in 138.454s |
| manage.py test --parallel --keepdb + with md5 password hashing |
Ran 442 tests in 130.763s |
| manage.py test --parallel --keepdb + pg without fsync | Ran 442 tests in 82.288s |
Other tips
- Use logging instead of printing
- -W ignore
- ./manage.py test --reverse
Running only specific tests
python manage.py testmail.tests.test_send_notification.TestSendNotificationConditionHours
In Pycharm:
right click on test -> copy reference
Avoid running migrations
if env.bool("TEST_WITHOUT_MIGRATIONS", False):
MIGRATION_MODULES = {
app.split(".")[-1]: None
for app in INSTALLED_APPS
if app not in ["replication_utils"]
}Create db based on models
Detect testing mode
import sys
TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test'Speedup indivudal tests

https://github.com/realpython/django-slow-tests
Speedup indivudal tests
TEST_RUNNER = 'django_slowtests.testrunner.DiscoverSlowestTestsRunner'
NUM_SLOW_TESTS = 10Find slow tests

Speedup indivudal tests
Mock requests

class BaseMockTestCase(SimpleTestCase):
def setUp(self) -> None:
self.requests_mock = requests_mock.mock()
self.requests_mock.start()
self.addCleanup(self.requests_mock.stop)
super().setUp()
TestCase vs TransactionTestCase
(Avoid TransactionTestCase)
Speedup indivudal tests

Hit the db only when necessary
Speedup indivudal tests

Avoid fixtures
Use factories (faster and can evolve)
Speedup indivudal tests

Postgresql
fsync = off synchronous_commit = off full_page_writes = off

Postgresql
UNLOGGED TABLE

Thank You

Django fast tests
By zqzak
Django fast tests
- 335