Skip to content

Commit b0fe00e

Browse files
author
Ryan P Kilby
authored
Merge pull request #138 from rpkilby/perf-tests
Add performance tests
2 parents 1998540 + ab83be8 commit b0fe00e

File tree

7 files changed

+139
-7
lines changed

7 files changed

+139
-7
lines changed

.travis.yml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,23 @@ python:
88
- "3.4"
99
- "3.5"
1010
env:
11-
- DJANGO="django>=1.10.0,<1.11.0" REST_FRAMEWORK="djangorestframework>=3.4,<3.5"
12-
- DJANGO="django>=1.9.0,<1.10.0" REST_FRAMEWORK="djangorestframework>=3.4,<3.5"
11+
- DJANGO="django>=1.10.0,<1.11.0" REST_FRAMEWORK="djangorestframework>=3.5,<3.6"
12+
- DJANGO="django>=1.9.0,<1.10.0" REST_FRAMEWORK="djangorestframework>=3.5,<3.6"
13+
- DJANGO="django>=1.8.0,<1.9.0" REST_FRAMEWORK="djangorestframework>=3.5,<3.6"
1314
- DJANGO="django>=1.8.0,<1.9.0" REST_FRAMEWORK="djangorestframework>=3.4,<3.5"
14-
- DJANGO="django>=1.8.0,<1.9.0" REST_FRAMEWORK="djangorestframework>=3.3,<3.4"
1515
install:
16-
- travis_retry pip install -q $DJANGO $REST_FRAMEWORK "coverage==3.7.1"
16+
- travis_retry pip install -q $DJANGO $REST_FRAMEWORK coverage
1717
- pip install .
1818
script:
19-
- coverage run manage.py test
19+
- coverage run manage.py test -v 2
2020
- coverage report
2121
after_success:
2222
- bash <(curl -s https://codecov.io/bash)
2323

2424
matrix:
2525
exclude:
2626
- python: "3.3"
27-
env: DJANGO="django>=1.10.0,<1.11.0" REST_FRAMEWORK="djangorestframework>=3.4,<3.5"
27+
env: DJANGO="django>=1.10.0,<1.11.0" REST_FRAMEWORK="djangorestframework>=3.5,<3.6"
2828
- python: "3.3"
29-
env: DJANGO="django>=1.9.0,<1.10.0" REST_FRAMEWORK="djangorestframework>=3.4,<3.5"
29+
env: DJANGO="django>=1.9.0,<1.10.0" REST_FRAMEWORK="djangorestframework>=3.5,<3.6"
3030
fast_finish: true

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)