حساب الاستعلام: اختبار أداء جانغو الأساسي

تحية للجميع. لقد أعددنا ترجمة لمواد أخرى مفيدة لطلاب الدورة التدريبية "Web-developer in Python" ، والتي بدأت أمس.





يمكنك غالبًا أن تسمع عن طرق الاختبار مثل TDD ، وكيفية اختبار منطق العمل لأحد التطبيقات. ومع ذلك ، يعد اختبار أداء التطبيق مهمة مختلفة تمامًا. هناك العديد من الطرق المختلفة ، ولكن النهج الأكثر شيوعًا هو إنشاء بيئة يمكنك من خلالها تنفيذ هجوم DDoS على تطبيقك ومراقبة سلوكه. هذا موضوع مثير للاهتمام للغاية ، لكن هذا ليس ما أريد أن أتحدث عنه اليوم. سنلقي نظرة اليوم على اختبار أبسط ، اختبار يمكنك إجراؤه باستخدام اختبارات وحدة Django الافتراضية: أي اختبار عدد المرات التي يصل فيها تطبيقك إلى قاعدة البيانات.

اختبار هذا بسيط للغاية ، وهذا بالضبط هو الجانب الذي يمكن أن يضر بأداء التطبيق في المراحل المبكرة. هذا الجانب هو أول ما يتم اختباره عندما يبدأ شيء ما في العمل ببطء. الخبر السار هو أن هناك شيء واحد فقط تحتاج إلى معرفته لكتابة اختبارات من هذا النوع: طريقة assertNumQueries ، وهي سهلة الاستخدام. هنا مثال:

from django.test import TestCase, Client
from django.urls import reverse
from trucks.models import Truck

class TrucksTestCase(TestCase):
    def test_list_trucks_view_performance(self):
        client = Client()

        Truck.objects.create(...)

        with self.assertNumQueries(6):
            response = client.get(reverse("trucks:list_trucks"))

        self.assertEqual(response.context["trucks_list"], 1)

يدعي الرمز أعلاه أنه أثناء العرض ، "trucks:list_trucks"سيصل التطبيق إلى قاعدة البيانات 6 مرات فقط. ولكن هناك شيء آخر ، لاحظ أنه قبل البدء ، نقوم أولاً بإنشاء كائن جديد Truck، وبعد ذلك نقول أن trucks_listهناك كائن واحد على الأقل في بيانات سياق العرض . في هذا النوع من الاختبارات ، هذا مهم ، لأنك تحتاج إلى ضمان أنك لا تختبر على مجموعة بيانات فارغة. من المهم أن نفهم أن مجرد إنشاء فصل دراسي Truckلا يكفي. تحتاج إلى التحقق مما إذا كان قد تم تضمينه في السياق. ربما تقوم بتصفية قائمة الشاحنات ، لذلك من المحتمل Truckألا يتم تضمين مثيلك في النتيجة.

بعد القيام بكل ما سبق ، حققنا بالفعل تقدمًا كبيرًا ، ولكن هناك خطوة مهمة أخرى يسهل نسيانها. إذا أردنا توسيع نطاق وجهات نظرنا ، يجب أن نتأكد من أن الأداء لا ينخفض ​​مع زيادة عدد العناصر التي يتم إرجاعها. في النهاية ، لا تزال لدينا مشكلة في الأداء إذا لجأنا إلى قاعدة البيانات ليس 6 مرات للحصول على عنصر واحد ، ولكن 106 إذا كان لدينا 100 عنصر. نحتاج إلى عدد ثابت من مكالمات قاعدة البيانات ، والتي لن تعتمد على عدد العناصر المرتجعة. لحسن الحظ ، تم حل هذه المشكلة أيضًا بكل بساطة ، نحتاج إلى إضافة عنصر آخر (أو عدة عناصر) إلى قاعدة البيانات ونعد مرة أخرى عدد النتائج. هذه هي الطريقة التي سيبدو بها الاختبار في النسخة النهائية:

from django.test import TestCase, Client
from django.urls import reverse
from trucks.models import Truck

class TrucksTestCase(TestCase):
    def test_list_trucks_view_performance(self):
        client = Client()

        Truck.objects.create(...)

        with self.assertNumQueries(6):
            response = client.get(reverse("trucks:list_trucks"))

        self.assertEqual(response.context["trucks_list"], 1)

        Truck.objects.create(...)

        with self.assertNumQueries(6):
            response = client.get(reverse("trucks:list_trucks"))

        self.assertEqual(response.context["trucks_list"], 2)

لاحظ أننا نتحقق مرة أخرى من عدد العناصر التي تم إرجاعها في السياق ، ولكن في الجولة الثانية نتوقع شاحنتين ( Truck). سبب هذا السلوك مشابه للحالة الأولى.

يعد ضمان عدد ثابت من المكالمات لقاعدة البيانات عند إضافة بيانات جديدة أكثر أولوية من ضمان عدد صغير من المكالمات بشكل عام.

آخر شيء تفعله هو التأكد من أن بياناتك رطبة قدر الإمكان. هذا يعني أنك بحاجة إلى إنشاء بيانات ذات صلة سيتم استخدامها أثناء معالجة العرض الخاص بك. إذا لم تقم بذلك ، فهناك خطر من أن التطبيق الخاص بك سوف يصل إلى قاعدة البيانات في كثير من الأحيان في الإنتاج أكثر من الاختبار (على الرغم من أنه قد ينجح). في مثالنا ، كنا بحاجة إلى إنشاء TruckDriverشركة لديناTruck.

from trucks.models import Truck, TruckDriver
...
        truck = Truck.objects.create(...)
        TruckDriver.objects.create(name="Alex", truck=truck)

إذا لم يعد عدد مكالمات قاعدة البيانات ثابتًا بعد تنفيذ الخطوات الموضحة أعلاه ، فابحث عن مزيد من المعلومات حول الأساليب select_related و prefetch_related .

هذا كل شيء لهذا اليوم ، آمل أن تبدأ من هذه اللحظة في التحقق من عدد الاستفسارات الخاصة بطلبك إلى قاعدة البيانات في بداية المشروع. لن يستغرق ذلك الكثير من الوقت ، ولكنه سيمنع المشاكل التي قد تنشأ مع زيادة عدد مستخدمي تطبيقك.

بالمناسبة ، لا يزال بإمكانك متابعة الدورة . أراك لاحقا.

All Articles