Django Testing

Kader Miyanyedi
3 min readOct 16, 2020

Projelerimizi geliştirirken zaman zaman bizim ya da kullanıcı tarafından bulunan hatalarla karşılaşırız. Yazdığımız kodlar için aynı zamanda testler oluşturarak bu hataları son kullanıcıya gitmeden tespit edebiliriz. Test yazmak iyi bir kod yapılandırmasına, hataları bulmamıza ve kodumuzu inceleyecek kişilere dökümantasyon konusunda yardımcı olur. Kodlarımızda yaptığımız değişikliklerin ardından ortaya çıkacak sorunlarda saatlerce kod satırları arasında kaybolmaktansa değişen bölümlere ait testler yazarak sorunlarımızı daha hızlı tespit edebiliriz. Bu yazımızda basit bir django uygulaması yapacağız ve ilgili testleri yazacağız.

django-admin startproject blog
cd blog
./manage.py startapp api

Proje klasörümüzü oluşturduğumuza göre projemizi yazabiliriz. Yazımızın konusu testing olduğu için model,view yazımı üzerinde çok fazla durmayacağız.

models.py

views.py

forms.py

urls.py

Django uygulamamızı oluşturduğumuzda tests.py isimli bir dosya oluşmaktadır. Ben testlerimi burada yazacağım ancak daha büyük projelerimizde yönetilebilirilik açısından model, view gibi dosyalarımız için ayrı test dosyaları oluşturmak ve bunları bir klasör altında toplamak daha uygun olabilir.

İlk olarak gerekli kütüphaneleri içeri aktaralım.

from django.test import TestCase
from .models import Blog, Comment
from django.urls import reverse
from django.contrib.auth.models import User

Django testleri çalıştırılırken veritabanımızın bir sanal kopyası oluşturulur ve test sırasındaki işlemler burada gerçekleşir. Veritabanımızda herhangi bir değişiklik olmaz.

class BlogApiTest(TestCase):
def test_post_and_comment_create(self):
author = User.objects.create(username="admin", password="admin")
post = Blog.objects.create(
author=author, title="text.py", detail="test.py deneme"
)
comment = Comment.objects.create(
post=post, comment_author="test", comment_text="test"
)
self.assertEqual(post.comments.count(), 1)

Djangonun shellini daha önce kullandıysanız burada yer alan ifadeler çokta yabancı değildir. User objesinden username ve passwordu admin olan bir nesne oluşturduk. Bu nesneyi kullanarak bir blog nesnesi, blog nesnesini kullanarakta bir yorum nesnesi oluşturduk. Burada yer alan assertEqual verilen iki değerin birbirine eşit olup olmadığını boolean bir değer olarak döndürür.

def test_model_str(self):
author = User.objects.create(username="admin", password="admin")
post = Blog.objects.create(
author=author, title="test.py", detail="test.py deneme"
)
self.assertEqual(str(post), "test.py")

Modellerimizi oluştururken “__str__ “ fonksiyonunu ezerek oluşturulan nesnenin isminin title olmasını sağlamıştık. Bu test ile bu işlemin doğru bir şekilde gerçekleşip gerçekleşmediğini test ediyoruz.

def test_title_max_length(self):
post = Blog
max_length = post._meta.get_field("title").max_length
self.assertEquals(max_length, 50)

Modellerimize _meta özniteliği ile ulaşabilir ve modelimiz hakkında bilgi edinebiliriz.

def test_can_login(self):
data = {
"username": "admin",
"password": "admin",
}
response = self.client.post(reverse("login"), data=data)
self.assertEqual(response.status_code, 200)

Login sayfamız için bir test yazdık. Gerekli datayı gönderdiğimizde bize dönecek olan response içerisindeki status code 200 ise login işlemi başarı ile gerçekleşmiş anlamına gelmektedir.

def test_view_url_exists_at_desired_location(self):
response = self.client.get("/swagger/")
self.assertEqual(response.status_code, 200)
def test_view_url_accessible_by_name(self):
response = self.client.get(reverse("index"))
self.assertEqual(response.status_code, 200)
def test_view_uses_correct_template(self):
response = self.client.get(reverse("index"))
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, "api/index.html")

İlk iki testimiz temelde aynı işlemi farklı yöntemlerle yapmaktadır. Testlerden ilki sayfaya url ismine göre get isteği atarken, ikinci testimiz urlde verdiğimiz name göre sayfaya get isteği atmaktadır. 3. testimizde ise doğru template kullanılıp kullanılmadığı test edilmiştir. Testlerimizi hazırladığımıza göre bunları çalıştırarak sonucu görelim.

python manage.py test

Bu yazımızda basit olarak django testlerine değinmiş olduk. Test konusunda daha fazla bilgi edinmek için kendi dökümantasyonuna bakabilirsiniz. Bir sonraki yazımızda görüşmek üzere..

--

--