Penghitungan Kueri: Pengujian Kinerja Django Dasar

Halo semuanya. Kami telah menyiapkan terjemahan dari materi lain yang bermanfaat bagi siswa kursus "Pengembang web dengan Python" , yang dimulai kemarin.





Anda dapat sering mendengar tentang metode pengujian seperti TDD, dan cara menguji logika bisnis suatu aplikasi. Namun, menguji kinerja aplikasi adalah tugas yang sama sekali berbeda. Ada banyak cara berbeda, tetapi pendekatan yang paling umum adalah menciptakan lingkungan di mana Anda dapat melakukan serangan DDoS pada aplikasi Anda dan mengamati perilakunya. Ini adalah topik yang sangat menarik, tetapi ini bukan yang ingin saya bicarakan hari ini. Hari ini kita akan melihat tes yang lebih sederhana, yang dapat Anda lakukan menggunakan tes unit Django default: yaitu, menguji berapa kali aplikasi Anda mengakses database.

Pengujian ini sangat sederhana, dan ini adalah aspek yang dapat melukai kinerja aplikasi pada tahap awal. Aspek ini adalah yang pertama kali diuji ketika sesuatu mulai bekerja lambat. Berita baiknya adalah hanya ada satu hal yang perlu Anda ketahui untuk menulis tes semacam ini: metode assertNumQueries , dan itu cukup mudah digunakan. Berikut ini sebuah contoh:

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)

Kode di atas mengklaim bahwa selama tampilan, "trucks:list_trucks"aplikasi akan mengakses database hanya 6 kali. Tetapi ada sesuatu yang lain, perhatikan bahwa sebelum memulai, pertama-tama kita membuat objek baru Truck, dan setelah itu kita mengatakan bahwa trucks_listsetidaknya ada satu objek dalam konteks data tampilan . Dalam tes semacam ini, ini penting, karena Anda memerlukan jaminan bahwa Anda tidak menguji pada set data kosong. Penting untuk dipahami bahwa hanya membuat kelas saja Trucktidak cukup. Anda perlu memeriksa apakah sudah dimasukkan dalam konteks. Mungkin Anda memfilter daftar truk, jadi kemungkinan instance Anda Trucktidak akan dimasukkan dalam hasilnya.

Setelah melakukan semua hal di atas, kami telah membuat kemajuan yang signifikan, tetapi ada langkah penting lain yang mudah dilupakan. Jika kita ingin skala pandangan kita, kita harus memastikan bahwa kinerja tidak menurun ketika jumlah item yang dikembalikan tumbuh. Pada akhirnya, kami masih memiliki masalah kinerja jika kami beralih ke database bukan 6 kali untuk mendapatkan satu item, tetapi 106 jika kami memiliki 100 item. Kami membutuhkan jumlah panggilan database yang konstan, yang tidak akan bergantung pada jumlah item yang dikembalikan. Untungnya, masalah ini juga diselesaikan dengan sangat sederhana, kita perlu menambahkan satu (atau beberapa) elemen lagi ke dalam basis data dan menghitung lagi jumlah hit. Ini adalah bagaimana tes akan terlihat di versi final:

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)

Perhatikan bahwa kami kembali memeriksa jumlah item yang dikembalikan dalam konteks, tetapi pada putaran kedua kami mengharapkan 2 truk ( Truck). Alasan untuk perilaku ini mirip dengan kasus pertama.

Memastikan jumlah panggilan konstan ke basis data saat menambahkan data baru lebih prioritas daripada memastikan sejumlah kecil panggilan secara umum.

Hal terakhir yang harus dilakukan adalah memastikan bahwa data Anda terhidrasi mungkin. Ini berarti bahwa Anda perlu membuat data terkait yang akan digunakan selama pemrosesan tampilan Anda. Jika tidak, ada risiko bahwa aplikasi Anda akan mengakses database lebih sering dalam produksi daripada dalam pengujian (meskipun mungkin berhasil). Dalam contoh kita, kita perlu membuat TruckDriverperusahaan untuk kitaTruck.

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

Jika jumlah panggilan basis data tidak lagi konstan setelah melakukan langkah-langkah yang dijelaskan di atas, maka cari informasi lebih lanjut tentang metode select_related dan prefetch_related .

Itu saja untuk hari ini, saya harap mulai saat ini Anda akan mulai memeriksa jumlah permintaan aplikasi Anda untuk database pada awal proyek. Ini tidak akan memakan banyak waktu, tetapi akan mencegah masalah yang mungkin timbul dengan peningkatan jumlah pengguna aplikasi Anda.

Ngomong-ngomong, Anda masih bisa mengikuti kursus . Sampai jumpa.

All Articles