mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-06 13:30:12 +03:00
Added full stack benchmarks with filters.
This commit is contained in:
parent
a8e7f664db
commit
36cd8663d4
|
@ -1,11 +1,13 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
from datetime import datetime
|
||||||
|
from django.utils import unittest
|
||||||
|
|
||||||
from pytest import mark
|
from pytest import mark
|
||||||
|
|
||||||
from datetime import datetime
|
|
||||||
from rest_framework import viewsets, serializers
|
from rest_framework import viewsets, serializers
|
||||||
|
from rest_framework.filters import DjangoFilterBackend
|
||||||
from rest_framework.reverse import reverse
|
from rest_framework.reverse import reverse
|
||||||
from rest_framework.routers import DefaultRouter
|
from rest_framework.routers import DefaultRouter
|
||||||
from rest_framework.test import APITransactionTestCase
|
from rest_framework.test import APITransactionTestCase
|
||||||
|
@ -76,8 +78,14 @@ class RegularFieldsAndFKViewSet(viewsets.ModelViewSet):
|
||||||
serializer_class = TestNestedSerializer
|
serializer_class = TestNestedSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class FilteredRegularFieldsAndFKViewSet(RegularFieldsAndFKViewSet):
|
||||||
|
filter_backends = (DjangoFilterBackend,)
|
||||||
|
filter_fields = ('big_integer_field',)
|
||||||
|
|
||||||
|
|
||||||
router = DefaultRouter()
|
router = DefaultRouter()
|
||||||
router.register('benchmark', RegularFieldsAndFKViewSet, base_name='benchmark')
|
router.register('benchmark', RegularFieldsAndFKViewSet, base_name='benchmark')
|
||||||
|
router.register('benchmark2', FilteredRegularFieldsAndFKViewSet, base_name='benchmark-filter')
|
||||||
|
|
||||||
urlpatterns = router.urls
|
urlpatterns = router.urls
|
||||||
|
|
||||||
|
@ -152,3 +160,45 @@ class FullStackBenchmarksTestCase(APITransactionTestCase):
|
||||||
|
|
||||||
response = self.client.delete(url)
|
response = self.client.delete(url)
|
||||||
assert response.status_code == 204, (response.rendered_content, url)
|
assert response.status_code == 204, (response.rendered_content, url)
|
||||||
|
|
||||||
|
|
||||||
|
class FullStackFilteredBenchmarksTestCase(APITransactionTestCase):
|
||||||
|
urls = 'tests.test_full_stack_benchmarks'
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
RegularFieldsModel2.objects.bulk_create([RegularFieldsModel2(**d) for d in data_list])
|
||||||
|
|
||||||
|
RegularFieldsAndFKModel2.objects.bulk_create(
|
||||||
|
[RegularFieldsAndFKModel2(fk=o, **data) for o in RegularFieldsModel2.objects.all()])
|
||||||
|
|
||||||
|
self.first_pk = RegularFieldsAndFKModel2.objects.only('pk').first().pk
|
||||||
|
self.last_pk = RegularFieldsAndFKModel2.objects.only('pk').last().pk
|
||||||
|
|
||||||
|
@mark.bench('viewsets.ModelViewSet.list', iterations=1000)
|
||||||
|
def test_viewset_list(self):
|
||||||
|
url = reverse('benchmark-filter-list')
|
||||||
|
|
||||||
|
response = self.client.get(url, data={'big_integer_field': 100000})
|
||||||
|
assert response.status_code == 200, (response.rendered_content, url)
|
||||||
|
|
||||||
|
@mark.bench('viewsets.ModelViewSet.retrieve', iterations=10000)
|
||||||
|
def test_viewset_retrieve(self):
|
||||||
|
url = reverse('benchmark-filter-detail', args=[self.first_pk])
|
||||||
|
|
||||||
|
response = self.client.get(url, data={'big_integer_field': 100000})
|
||||||
|
assert response.status_code == 200, (response.rendered_content, url)
|
||||||
|
|
||||||
|
@mark.bench('viewsets.ModelViewSet.list', iterations=1000)
|
||||||
|
def test_viewset_list_nothing(self):
|
||||||
|
url = reverse('benchmark-filter-list')
|
||||||
|
|
||||||
|
response = self.client.get(url, data={'big_integer_field': 100001})
|
||||||
|
assert response.rendered_content == '[]', (response.rendered_content, url)
|
||||||
|
|
||||||
|
@mark.bench('viewsets.ModelViewSet.retrieve', iterations=10000)
|
||||||
|
@unittest.skip('pytest-bench cannot benchmark operations that raise exceptions')
|
||||||
|
def test_viewset_retrieve_nothing(self):
|
||||||
|
url = reverse('benchmark-filter-detail', args=[self.first_pk])
|
||||||
|
|
||||||
|
response = self.client.get(url, data={'big_integer_field': 100001})
|
||||||
|
assert response.status_code == 404, (response.rendered_content, url)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user