Django / سير تطبيق موثوق / الدرس 12
اختبار الطلبات وحدود التطبيق
طابق أدلة الوحدة والعميل والقاعدة والمتصفح بالوعد المختبر ضمن إعداد وعينات معزولة.
في هذه الصفحة
أهداف الدرس
- البدء بالعقد الملحوظ
- اختبار عميل كامل بلا قاعدة
- ضبط المتعاونين وحفظ الفشل المفيد
البدء بالعقد الملحوظ
يقدم الاختبار مدخلا وعملا ونتيجة مبررة. اشتق المتوقع من المتطلب لا نسخ الحساب. للتعديل المحمي أكد بقاء المورد ونجاح المالك لا الحالة فقط. لا تثبت لقطة المفاتيح والتعافي. اختر أصغر حد يغطي الوعد وأضف تكاملا عند عبور نظام؛ فقد يصعب تشخيص اختبار كبير بافتراضات كثيرة. وقد ينجح فحص استجابة منع مع بقاء كتابة جزئية، لذلك لا بد أن تكون سلامة الحالة المخزنة جزءا من الوعد الملحوظ في الاختبار.
معرفة أداة الاختبار المستخدمة
تعزل RequestFactory العرض، ويقود Client المنظومة داخل العملية لا متصفحا ووكيلا. تناسب SimpleTestCase ما لا يستعمل قاعدة، وتختلف حالات المعاملة. تحقق من قاعدة اختبار قابلة للاستغناء؛ فلا يثبت الاسم أمان الوجهة. تفيد SQLite ولا تمثل كل قفل ومحلية وJSON وترحيل. لا تعتبر الأخضر دليلا للنشر كله. ولا تثبت تسمية بيئة بأنها اختبار أن وجهتها قابلة للاستغناء؛ يجب التأكد من الإعداد الفعلي قبل أي حالة تحتاج إلى قاعدة أو ترحيل.
اختبار عميل كامل بلا قاعدة
يعرف البرنامج عنوانا وعرضا ويشغل SimpleTestCase بمشغل Python ويفحص الحالة والجسم، ويطبع ملخصا ثابتا مع حجب الزمن. يختبر التوجيه داخل العملية دون خادم وقاعدة، ولا يثبت المصادقة والسكربت والوكيل والخادم الغائبة. يوضح الوعد الضيق لماذا تنجح التأكيدات. وتجنب مقارنة نص ملخص المشغل الكامل بما يحتويه من زمن، لأن ذلك يخلط نجاح السلوك مع قيمة تتغير بحسب الجهاز وحمل التنفيذ.
from django.conf import settings
settings.configure(
SECRET_KEY="synthetic-course-key",
USE_I18N=False, USE_TZ=True,
INSTALLED_APPS=[],
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
DEFAULT_AUTO_FIELD="django.db.models.AutoField",
ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()
import io
import unittest
from django.http import HttpResponse
from django.test import SimpleTestCase, override_settings
from django.urls import path
def ping(request):
return HttpResponse("ready", content_type="text/plain")
urlpatterns = [path("ping/", ping)]
@override_settings(ROOT_URLCONF=__name__)
class PingTests(SimpleTestCase):
def test_ready(self):
response = self.client.get("/ping/")
self.assertEqual(response.status_code, 200)
self.assertEqual(response.content, b"ready")
result = unittest.TextTestRunner(stream=io.StringIO()).run(unittest.defaultTestLoader.loadTestsFromTestCase(PingTests))
print(result.testsRun, result.wasSuccessful())
1 True
تشغل العينة اختبارا بلا قاعدة وبملخص ثابت ودون خادم HTTP.
تفعيل فحص CSRF عند اختبار عقده
يرخي Client العادي CSRF فلا يثبت POST الناجح توصيل المتصفح. يفعّل المثال enforce_csrf_checks مع الوسيط ويرفض كتابة بلا رمز بـ403 دون شبكة وحساب. أضف نجاحا محميا لاختبار التسليم والأصل بعزل. لا تعطل وسيط الإنتاج ليطابق الاختبار ولا تخلط الرفض مع حقول النموذج. ويجب أن يرافق اختبار الرفض اختبار إرسال صحيح محمي في التطبيق المعزول، حتى لا يكون نجاح السالب ناتجا عن مسار يرفض جميع الطلبات.
from django.conf import settings
settings.configure(
SECRET_KEY="synthetic-course-key",
USE_I18N=False, USE_TZ=True,
INSTALLED_APPS=[],
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
DEFAULT_AUTO_FIELD="django.db.models.AutoField",
ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()
from django.http import HttpResponse
from django.test import Client, override_settings
from django.urls import path
def write(request):
return HttpResponse("accepted", content_type="text/plain")
urlpatterns = [path("write/", write)]
with override_settings(ROOT_URLCONF=__name__, MIDDLEWARE=["django.middleware.csrf.CsrfViewMiddleware"], TEMPLATES=[{"BACKEND": "django.template.backends.django.DjangoTemplates", "APP_DIRS": False}]):
response = Client(enforce_csrf_checks=True).post("/write/", {})
print(response.status_code)
403
يرفض الوسيط طلبا غير آمن بلا رمز عمدا ضمن برنامج معزول كامل.
ضبط المتعاونين وحفظ الفشل المفيد
استخدم عينات وزيفا للبريد وAPI والتخزين لطلب الأثر واحتفظ بتكامل موائم حين تهم دلالاته. لا ترسل حقيقيا أو تنشئ خارجيا للاختبار العادي. نظف بالنجاح والفشل واختبر الضيف والمسموح والآخر واضبط ترتيب الاكتمال. احفظ حالة تراجع وأعد المناسب للتغيير دون توسيع متكرر بلا قلق جديد. وإذا أصلحت عيبا محددا، فاحفظ حالة تمنع عودته وأعد الاختبارات التي تمسها الحدود المتغيرة، بدلا من تكرار نطاق واسع بلا تغيير أو دليل جديد.
الأخطاء الشائعة وإصلاحها
ينجح الاختبار ويفشل CSRF بالمتصفح
- لماذا يحدث؟
- تجاوز العميل الفحص.
- كيف تصلحه؟
- فعله لعقده.
- كيف تتجنب تكراره؟
- افصل الرفض والنجاح المحمي.
ينجح الإذن رغم كتابة جزئية
- لماذا يحدث؟
- فحص الحالة فقط.
- كيف تصلحه؟
- أكد حفظ المخزن.
- كيف تتجنب تكراره؟
- اقرن السالب بالمسموح.
يتذبذب الاختبار بخدمة حية
- لماذا يحدث؟
- لم يضبط المتعاون.
- كيف تصلحه؟
- استخدم زيفا أو عينة معزولة.
- كيف تتجنب تكراره؟
- وضح الاعتماديات.
اختبر فهمك
1. ماذا يؤكد اختبار الملكية غير المنع؟
اعرض الحل المشروح
أعد قراءة القيم والمالك ثم اختبر نجاحه منفصلا لكشف كتابة قبل الرفض ورفض الجميع. الثابت المخزن جزء النتيجة لا تفصيل داخلي.
2. لماذا لا يثبت Client إعداد HTTPS بالوكيل؟
اعرض الحل المشروح
لا يعبر الوكيل ولا يثبت الترويسات وإنهاء TLS. استخدمه للتطبيق وأضف تكاملا مناسبا للنشر دون ادعاء طبقة غائبة.
أهم ما تعلمته
- اختر الحد قبل تفسير النجاح.
- صرح بفحص CSRF باختباره.
- اعزل الموارد وأكد النتائج.