Skip to content

Commit 290e700

Browse files
author
Ryan P Kilby
committed
Add perf tests
1 parent 4f2c7e4 commit 290e700

File tree

6 files changed

+132
-0
lines changed

6 files changed

+132
-0
lines changed

tests/perf/__init__.py

Whitespace-only changes.

tests/perf/filters.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
from django_filters import FilterSet as DFFilterSet
3+
from rest_framework_filters import filters
4+
from rest_framework_filters.filterset import FilterSet as DRFFilterSet
5+
6+
from ..testapp.models import User, Note
7+
8+
9+
# df-filters
10+
class NoteFilterWithExplicitRelated(DFFilterSet):
11+
class Meta:
12+
model = Note
13+
fields = {
14+
'author__username': ['exact'],
15+
}
16+
17+
18+
# drf-filters
19+
class UserFilterWithAll(DRFFilterSet):
20+
username = filters.AllLookupsFilter()
21+
22+
class Meta:
23+
model = User
24+
25+
26+
class NoteFilterWithRelatedAll(DRFFilterSet):
27+
title = filters.AllLookupsFilter()
28+
author = filters.RelatedFilter(UserFilterWithAll)
29+
30+
class Meta:
31+
model = Note

tests/perf/serializers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
from rest_framework import serializers
3+
4+
from ..testapp.models import Note
5+
6+
7+
class NoteSerializer(serializers.ModelSerializer):
8+
class Meta:
9+
model = Note
10+
fields = ('pk', 'title', 'content', 'author', )

tests/perf/urls.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
from django.conf.urls import include, url
3+
from rest_framework import routers
4+
5+
from . import views
6+
7+
8+
router = routers.DefaultRouter()
9+
router.register(r'df-notes', views.DFNoteViewSet, base_name='df-notes')
10+
router.register(r'drf-notes', views.DRFFNoteViewSet, base_name='drf-notes')
11+
12+
13+
urlpatterns = [
14+
url(r'^', include(router.urls)),
15+
]

tests/perf/views.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
from rest_framework import viewsets
3+
from rest_framework import filters as df_backends
4+
from rest_framework_filters import backends
5+
6+
from ..testapp.models import Note
7+
from .serializers import NoteSerializer
8+
from .filters import NoteFilterWithExplicitRelated, NoteFilterWithRelatedAll
9+
10+
11+
class DFNoteViewSet(viewsets.ModelViewSet):
12+
queryset = Note.objects.all()
13+
serializer_class = NoteSerializer
14+
filter_backends = (df_backends.DjangoFilterBackend, )
15+
filter_class = NoteFilterWithExplicitRelated
16+
17+
18+
class DRFFNoteViewSet(viewsets.ModelViewSet):
19+
queryset = Note.objects.all()
20+
serializer_class = NoteSerializer
21+
filter_backends = (backends.DjangoFilterBackend, )
22+
filter_class = NoteFilterWithRelatedAll

tests/test_performance.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import argparse
2+
import time
3+
4+
from django.test import TestCase, Client, override_settings
5+
from django.core.urlresolvers import reverse
6+
7+
8+
parser = argparse.ArgumentParser()
9+
parser.add_argument(
10+
'-v', '--verbosity', action='store', dest='verbosity', default=1,
11+
type=int, choices=[0, 1, 2, 3],
12+
)
13+
args, _ = parser.parse_known_args()
14+
15+
16+
@override_settings(ROOT_URLCONF='tests.perf.urls')
17+
class PerformanceTests(TestCase):
18+
19+
@classmethod
20+
def setUpTestData(cls):
21+
cls.client = Client()
22+
cls.iterations = range(1000)
23+
cls.threshold = 1.2
24+
25+
def test_sanity(self):
26+
# sanity check to ensure our request are behaving as expected
27+
response = self.client.get(reverse('df-notes-list'), {'author__username': 'bob'})
28+
self.assertEqual(response.status_code, 200)
29+
30+
response = self.client.get(reverse('drf-notes-list'), {'author__username': 'bob'})
31+
self.assertEqual(response.status_code, 200)
32+
33+
def test_response_time(self):
34+
35+
start = time.time()
36+
for i in self.iterations:
37+
self.client.get(reverse('df-notes-list'), {'author__username': 'bob'})
38+
stop = time.time()
39+
df_time = stop - start
40+
41+
start = time.time()
42+
for i in self.iterations:
43+
self.client.get(reverse('drf-notes-list'), {'author__username': 'bob'})
44+
stop = time.time()
45+
drf_time = stop - start
46+
47+
if args.verbosity >= 2:
48+
print('\n' + '-' * 32)
49+
print('Response time performance')
50+
print('django-filter time:\t%.4fs' % df_time)
51+
print('drf-filters time:\t%.4fs' % drf_time)
52+
print('-' * 32)
53+
54+
self.assertTrue(drf_time < (df_time * self.threshold))

0 commit comments

Comments
 (0)