2016-09-03 1 views
1

Was ist der richtige Weg, Throttling in DRF zu testen? Ich konnte keine Antwort auf diese Frage im Internet finden. Ich möchte separate Tests für jeden Endpunkt haben, da jeder benutzerdefinierte Anforderungen Grenzen (ScopedRateThrottle) hat.Was ist der richtige Weg, Throttling in DRF zu testen?

Die wichtige Sache ist, dass es andere Tests nicht beeinflussen kann - sie müssen irgendwie ohne Drosseln und Begrenzung laufen.

+1

Die erste Frage, die Sie sich stellen müssen: Testen Sie Ihren Code? In der Regel macht es keinen Sinn, den Code von Drittanbietern in Unit-Tests zu testen. Das ist die Aufgabe der dritten Partei. Sie können sie im Integrations- und Verhaltenstest testen. Sie haben nichts darüber geschrieben, welche Art von Test Sie durchführen möchten. –

+0

Ok, danke @KlausD., Ich werde es dann nicht testen. – Glen

+0

Es ist wahrscheinlich nicht sinnvoll, solche Tests in Ihren lokalen Komponententest oder Ihre CI-Testsuite aufzunehmen. Ich denke jedoch, dass ein solcher Test auf einer Teilmenge von Endpunkten als Teil von periodischen Leistungstests wertvoll wäre. Daher bin ich immer noch daran interessiert, einen relativ einfachen und wiederholbaren Test dafür zu finden. –

Antwort

2

Wie die Menschen bereits erwähnt, dies nicht genau im Rahmen der Unit-Tests fallen, aber immer noch, wie sei es einfach so etwas wie dies zu tun:

from django.core.urlresolvers import reverse 
from django.test import override_settings 
from rest_framework.test import APITestCase, APIClient 


class ThrottleApiTests(APITestCase): 
    # make sure to override your settings for testing 
    TESTING_THRESHOLD = '5/min' 
    # THROTTLE_THRESHOLD is the variable that you set for DRF DEFAULT_THROTTLE_RATES 
    @override_settings(THROTTLE_THRESHOLD=TESTING_THRESHOLD) 
    def test_check_health(self): 
     client = APIClient() 
     # some end point you want to test (in this case it's a public enpoint that doesn't require authentication 
     _url = reverse('check-health') 
     # this is probably set in settings in you case 
     for i in range(0, self.TESTING_THRESHOLD): 
      client.get(_url) 

     # this call should err 
     response = client.get(_url) 
     # 429 - too many requests 
     self.assertEqual(response.status_code, 429) 

Auch in Bezug auf Ihre Anliegen von Nebenwirkungen, Solange Sie die Benutzererstellung in setUp oder setUpTestData vornehmen, werden die Tests isoliert (wie sie sollten), so dass Sie sich in diesem Sinne keine Gedanken über "schmutzige" Daten oder Bereiche machen müssen.

In Bezug auf cache clearing between tests, ich würde einfach hinzufügen cache.clear() in tearDown oder versuchen und löschen Sie die specific key defined for throttling.

Verwandte Themen