Giriş.
Merhabalar. Mocking yada mocklama TDD(Test Driven Development) metodolojisinde önemli yer tutan bir kavramdır. Bu kavram kısaca test dublörleri olarak adlandırılabilir. Mock nesneleri, yani dublörler test edilen sistemin dışa bağımlı olduğu kısımlarda, bağımlı olunan nesnenin yerini tutarlar. Bu bir servis ya da metod vs olabilir. Amaç sistemi olabildiğince izole ederek, dış etkilerden bağımsız, sistemin sadece yapması beklenilen işi yapıp yapamadığını kontrol etmektir.
Bu kısa bilgiden sonra, Django ile geliştirilen bir projede email servis mock laması yaparak gerekli sistemi test etmeye bakalım.
Demo.
Ufak bir demo view yazalım, ve url dosyasında tanımlama yapalım.
your_app/views.py
from django import http from django.core.mail import send_mail from django.views import View from django.http import HttpResponse from django.core.validators import validate_email import logging logger = logging.getLogger(__name__) class SendMailView(View): def get(self, request, *args, **kwargs): email = request.GET.get("email") try: validate_email(email) send_mail( subject="MockMailing", message="Lorem ipsum dolor.", from_email="example@example.com", recipient_list=[email], fail_silently=False, ) return HttpResponse("mail sent!") except Exception as exc: logging.error(exc) return HttpResponse("mail not send.", status=400)
Basitçe query paramda bir email bekleyen, doğrulamaya çalışıp daha sonra da o adrese dummy bir mail atmaya çalışan bir view.
your_app/urls.py
from your_app.views import SendMailView from django.urls.conf import path urlpatterns = [ path("send/", SendMailView.as_view(), name="send-mail"), ]
Django testlerinizi yürütür iken otomatik olarak uygulamanızın settings dosyasında tanımlı backendi ezerek, onu aşağıdaki gibi tanımlar.
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
Locmem backendi, mail servisi mocklar ve test süresince gönderilen her maili ram üzerinde bir listede barındırır.
Testleri yazarak sistemin mail gönderme işlevini kontrol edelim.
your_app/tests.py
from django.test import TestCase from django.urls import reverse from django.core import mail class EmailSendTestCase(TestCase): def setUp(self) -> None: self.send_mail_url = reverse("send-mail") def test_send_mail_view_fail(self): invalid_email = "test-email.com" res = self.client.get(self.send_mail_url, data={"email":invalid_email}) self.assertEqual(res.status_code, 400) self.assertEqual(len(mail.outbox), 0) def test_send_mail_view_success(self): res = self.client.get(self.send_mail_url, data={"email": "hello@hello.com"}) self.assertEqual(res.status_code, 200) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, "MockMailing")
Testleri çalıştırdığınızda sistemin dış etkenlerden bağımsız olarak çalıştığını ve istenilen görevi yere getirdiğini görebilir, canlıdaki olası bir problemde projenizde sorunu aramaktansa kullanılan servise yoğunlaşabilirsiniz.
Not. Güncel bir Django sürümü kullanmıyor iseniz Django testlerinizi yürütürken otomatik olarak mail backendi değiştirmeyecektir. Bu davranışı test case’ine kazandırma adına yukarıdaki testi şu şekilde yürütme esnasında modifikasyona uğratabilirsiniz.
from django.test.utils import override_settings @override_settings(EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend') class EmailSendTestCase(TestCase): #same for above
Sonuç.
Uygulamanızın bağımlı olduğu servislerin mocklanması, test sırasında sistemi izole ve bağımsız hale getirererek , test kalitenizi ve güvenilirliğini yukarıya çekecektir. Olası problemlerde sorunu daha hızlı bulmanıza ve maliyetleri azaltmanıza yardımcı olur.
Django ve TDD yaklaşımı ve bu konu ile alakalı Django dökümantasyonuna göz atmak isterseniz linklenmiş dökümanlara devam edebilirsiniz.
İyi günler!
İlk Yorumu Siz Yapın