Keep detailed records of the performance of your Django code.
Project description
“Keep detailed records of the performance of your Django code.”
django-perf-rec is like Django’s assertNumQueries on steroids. It lets you track the individual queries and cache operations that occur in your code. Use it in your tests like so:
def test_home(self):
with django_perf_rec.record():
self.client.get('/')
It then stores a YAML file alongside the test file that tracks the queries and operations, looking something like:
MyTests.test_home:
- cache|get: home_data
- db: 'SELECT ... FROM myapp_table WHERE (myapp_table.id = #)'
- db: 'SELECT ... FROM myapp_table WHERE (myapp_table.id = #)'
Then if you re-run the test and the performance record doesn’t match, the test will fail. Magic! Just check the YAML file in alongside your test and you have unbreakable performance with much better clues about any regressions compared to assertNumQueries.
Installation
Use pip:
pip install django-perf-rec
Requirements
Tested with all combinations of:
Python: 2.7, 3.5
Django: 1.9
API
record(file_name=None, record_name=None)
Return a context manager that will be used for a single performance test. file_name is the name of the performance file to be used, and record_name is the name of the record inside that file to use. If either of these names is None, the code assumes you are inside a Django TestCase and uses magic stack inspection to find that test case, and set file_name to the name of the file containing that class with .py replaced by .perf.yml, and record_name will be named after the test case + name, plus an optional counter if you invoke record multiple times inside the same test method.
Whilst open, the context manager tracks all DB queries on all connections, and all cache operations on all defined caches. It names the connection/cache in the tracked operation it uses, except from for the default one.
When the context manager exits, it will use the list of operations it has gathered. If the file file_name doesn’t exist, or doesn’t contain data for the specific record_name, it will be created and saved and the test will pass with no assertions. However if the record does exist inside the file, the collected record will be compared with the original one, and if different, an AssertionError will be raised. This currently has an ugly message but if you’re using pytest its assertion rewriting will be used.
Example:
import django_perf_rec
from app.models import Author
class AuthorPerformanceTests(TestCase):
def test_special_method(self):
with django_perf_rec.record():
list(Author.objects.special_method())
TestCaseMixin
A mixin class to be added to your custom TestCase subclass so you can use django-perf-rec across your codebase without needing to import it in each individual test file. It adds one method, record_performance(), whose signature is the same as record() above.
Example:
# yplan/test.py
from django.test import TestCase as OrigTestCase
from django_perf_rec import TestCaseMixin
class TestCase(TestCaseMixin, OrigTestCase):
pass
# app/tests/models/test_author.py
from app.models import Author
from yplan.test import TestCase
class AuthorPerformanceTests(TestCase):
def test_special_method(self):
with self.record_performance():
list(Author.objects.special_method())
History
Pending release
New release notes go here
1.0.0 (2016-09-19)
Initial version with record() that can record database queries and cache operations and error if they change between test runs.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for django_perf_rec-1.0.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0324368af8c8e1e64f98297641a0df9b318ba991029b432702aeaaba414f4652 |
|
MD5 | 51b7d9c6660798aeffa68232ed8324e8 |
|
BLAKE2b-256 | bc92129483ff7568fc81b7bb1a89e9d55b6d70c4de5fcc43379121cb7e163488 |