مُقدّمة
بعد أن تعرّفنا على ماهية ميّزة الاختبارات في مُحرّك القوالب Jinja، وتعرّفنا على بعض من أهمّ الاختبارات المبنيّة مُسبقا في Jinja والتّي يُمكنك استعمالها مُباشرة لتطوير قوالبHTML الخاصّة بك، قد لا تجد ما يسدّ حاجتك في الاختبارات التّي درسناها، وكما فعلنا مع المُرشّحات، يُمكننا سدّ هذه الحاجة بإنشاء اختبارات خاصّة بنا لاختبار القيم والتّحقق ممّا إذا كانت تتّبع نمطا مُعيّنا أو لا.
مبدأ اختبارات Jinja المُخصّصة في إطار العمل Flask
قبل الانتقال إلى أمثلة تطبيقيّة حول كيفيّة إنشاء اختبارات خاصّة بك لاستعمالها في قوالب Jinja مع إطار العمل Flask، سنتعرّف أولا على الشّكل المبدئي للاختبار.
كما استعملنا المُزخرف template_filter
لإنشاء مُرشّحات خاصّة بنا، فإنّنا نستعمل مُزخرفا آخر لإنشاء اختبار مُخصّص، إذ نستعمل المُزخرف template_test
مع كائن التّطبيق app
لتمكين جميع القوالب من استخدام الاختبار.
شيفرة اختبار بسيط هي كالآتي:
@app.template_test(name='test_name') def test_name_function(value): # Test value return True
الشّيفرة شبيهة بشيفرة إنشاء مُرشّح مُخصّص، الفرق أنّنا نستعمل المُزخِرف template_test
ونُمرّر اسم الاختبار إلى المُعامل name
، ثمّ نمنح للدّالة المُزَخْرَفَةِ اسما مُعبّرا، الدّالة تستقبل قيمة افتراضيّة (القيمة المُختبَرَة) تتواجد داخل المُعامل value
، داخل الدّالة ستقوم بإجراءات لاختبار القيمة value
مكان التّعليق Test value
ثمّ تُرجع إمّا القيمة المنطقيّة True
أو القيمة المنطقيّة False
حسب ما إذا اجتازت القيمة الاختبار أو لا.
Quoteإذا لم تُمرّر اسم الاختبار إلى المُعامل
name
في المُزخرفtemplate_test
فسيُعيّن اسم الدّالة إلى الاختبار افتراضيّا، ما يعني بأنّه إن كان اسم الدّالةtest_name()
فاسم الاختبار سيكون هو نفسهtest_name
في حالة لم تُمرّر قيمة إلى المُعاملname
عند استخدام المُزخرفtemplate_test
.
طريقة استعمال الاختبار الذي تقوم بإنشائه هي نفسُها طريقة استعمال الاختبارات المبنيّة مُسبقا:
variable is test_name
لاحظ بأنّ الاختبار يجب أن يُرجع قيمة منطقيّة، ولتبسيط الأمور، فالمثال يُرجع دائما القيمة المنطقيّة True
.
مثال على اختبار للتّحقق من أنّ طول قيمة ما لا يتجاوز حدا مُعيّنا
في هذا المثال سنقوم بإنشاء اختبار للتّحقق ممّا إذا كانت سلسلة نصيّة مُعيّنة أكبر من 30 محرفا، الأمر الذي سيضمن لنا تنسيقا أفضل للصّفحات، فمثلا، لنقل بأنّك ترغب بأن تكون عناوين المقالات في تطبيقك قصيرة، ولنقل بأنّك لا ترغب في عرض أي عنوان تزيد عدد أحرفه عن الثّلاثين حرفا لسبب أو لآخر.
المثال التّالي يُوضّح كيفيّة إنشاء اختبار Jinja مُخصّص للتّحقّق من أنّ قيمة مُعيّنة أكبر من 30 محرفا:
@app.template_test(name='long')
def is_long_test(value):
is_long = len(value) > 30
return is_long # True if value is more than 30 characters long
نقوم أولا باستخدام المُزخرف app.template_test
مع تمرير الاسم long
إلى المعامل name
وبالتالي سنتمكّن من استعمال الاختبار بالاسم long
، في الدّالة المُزخرفة is_long_test
نقوم بإنشاء مُتغيّر is_long
يحمل إحدى القيمتين True
أو False
حسب ما إذا كان عدد أحرف السّلسلة النّصيّة value
المُمرّرة افتراضيّا إلى الاختبار أكبر من 30 أو لا، للتّحقق ممّا إذا كانت كذلك، نستعمل المُعامل >
(أكبر من) للمُقارنة بين طول القيمة value
الذي نحصل عليه باستخدام الدّالة len
والقيمة 30، في الأخير نُرجع قيمة المُتغيّر is_long
.
بعد إنشاء الاختبار في الملفّ project/__init__.py
ستتمكّن من اختباره كما يلي:
{{ 'Building A Web Application Using The Flask Framework' is long }}
<br>
{{ 'An Introduction To Flask' is long }}
النّتيجة:
True
False
في المثال اختبرنا قيمتين، الأولى عدد عناصرها أكبر من 30 محرفا، والقيمة الثّانية عبارة عن عنوان قصير لا يتعدّى الطّول الأقصى، لذا فمن الطّبيعي أن تكون نتيجة الاختبار الأول القيمة True
لأنّ العنوان طويل بالفعل، ونتيجة اختبار القيمة الثّانية هي القيمة False
لأنّ العنوان أقصر من الثّلاثين حرفا.
يُمكنك كذلك ترك تحديد أكبر قيمة للمُطوّر عبر جعلها مُعاملا كما هو مُوضّح في المثال التّالي:
@app.template_test(name='longer_than')
def is_long_test(value, number_of_characters=30):
is_long = len(value) > number_of_characters
return is_long
في هذا المثال أنشأنا اختبارا باسم longer_than
، الدّالة المسؤولة عن الاختبار تقبل مُعاملا واحدا بالإضافة إلى القيمة value
التّي تُمرّر افتراضيّا والتّي تُعتبر القيمة التّي تُختبر، بالنّسبة للمُعامل فقد سمّيناه number_of_characters
لأنّه يُمثّل عدد المحارف الذي سنعتبره الحد الأقصى لسلسلة نصيّة، افتراضيّا قيمة المُعامل number_of_characters
هي 30، ما يعني بأنّ الاختبار سيعمل بنفس طريقة عمل الاختبار long
في المثال السّابق إذا لم تُوفّر قيمة للمُعامل.
داخل الدّالة، الأمر مُشابه لطريقة عمل الاختبار long
، لكن عوضا عن مُقارنة طول قيمة المُعامل value
مع العدد 30، أصبحنا نُقارن الطّول مع قيمة المُعامل number_of_characters
الذي نحصل عليه من مُستخدم الاختبار.
هكذا سيكون لدينا اختبار يسمح لنا بالتّحقق ممّا إذا كانت سلسلة نصّيّة ما أطول من عدد مُعيّن أو لا، عوضا عن التّحقق ممّا إن كانت أطول من العدد 30 فقط.
المثال التّالي توضيح لكيفيّة استخدام الاختبار longer_than
الذي أنشأناه للتوّ:
{% set title = 'An Introduction To Flask' %}
{% if title is longer_than 40 %}
'Title is too long'
{% else %}
{{ title }}
{% endif %}
في هذا المثال، نُعرّف مُتغيّرا title
ونمنحه سلسلة نصيّة قصيرة، بعدها نختبر هذا المُتغيّر باستعمال الجملة الشّرطيّة if
والاختبار longer_than
، نتأكّد في الاختبار من أنّ السّلسلة النّصيّة المتواجدة بالمُتغيّر title
أطول من 40 محرفا، إن كانت كذلك فإنّنا نعرض الرّسالة 'Title is too long'
، وإن لم تكن كذلك فإنّنا نعرضها على صفحة HTML بشكل طبيعي.
بما أنّ العنوان غير طويل، فالنّتيجة ستكون عرض العنوان في الصّفحة وليس العكس:
An Introduction To Flask
لاختبار العكس استبدل سطر تعريف المُتغيّر title
بما يلي:
{% set title = 'Building A Web Application Using The Flask Framework' %}
في هذه الحالة، العنوان أطول من 40 محرفا، لذا فالنّتيجة ستكون الجملة 'Title is too long'
.
مثال على اختبار للتّحقق ممّا إذا كانت سلسلة نصيّة ما تنتهي بمقطع مُعيّن
في لغة بايثون، يُمكننا التّحقق من أنّ سلسلة نصيّة تنتهي بمقطع ما باستعمال التّابع endswith
مع تمرير المقطع كمُعامل.
مثال على كيفيّة استخدام التّابع endswith
داخل مُفسّر لغة بايثون:
>>> 'An Introduction To Flask'.endswith('Flask')
True
>>> 'An Introduction To Flask'.endswith('Python')
False
المُهمّة هي إنشاء اختبار Jinja للحصول على نفس النّتيجة، بحيث سيكون لدينا اختبار باسم endswith
ويقبل مُعاملا واحدا، ألا وهو المقطع الذي سنتحقّق ممّا إذا كان مُتواجدا بنهاية السّلسلة المُختَبَرَةِ أو لا.
ما يلي مثال على كيفيّة إنشاء الاختبار endswith
:
@app.template_test(name='endswith')
def endswith_test(value, end):
return value.endswith(end)
الاختبار بسيط جدّا، إذ كل ما نقوم به هو استعمال التّابع endswith
على القيمة value
مع تمرير قيمة المُعامل end
التّي تُعتبر المقطع الذي نرغب بالتّحقق من أنّ السّلسلة تنتهي به، وبما أنّ نتيجة استعمال التّابع ستكون إمّا القيمة True
أو القيمة False
، فالاختبار سيعمل دون مشاكل، لأنّ شرط اختبار أن تُرجع إحدى القيمتين.
المثال التّالي توضيح لكيفيّة استعمال الاختبار endswith
:
{% set title = 'Building A Web Application Using Flask' %}
{% if title is endswith('Flask') %}
'Title ends with the word Flask'
{% else %}
'Title does not end with the word Flask'
{% endif %}
في المثال، نقوم بالتّعريف الاعتيادي للمُتغيّر title
، مع تعيين عنوان ينتهي بالكلمة Flask
، بعدها نستعمل الاختبار للتّحقق ممّا إذا كان المُتغيّر title
ينتهي بالمقطع Flask
أو لا، فإن كان كذلك فإنّنا نعرض الرّسالة 'Title ends with the word Flask'
وإن لم يكن كذلك فالرّسالة تُصبح 'Title does not end with the word Flask'
.
وبما أنّ العنوان ينتهي بالمقطع Flask
فالنّتيجة هي الحالة الأولى:
'Title ends with the word Flask'
لاختبار الحالة الثّانية، غيّر سطر تعريف المُتغيّر title
إلى جملة لا تنتهي بالمقطع Flask
.
خاتمة
بنهاية هذا الدّرس، يجب أن تكون قادرا على كتابة واستخدام اختباراتك الخاصّة عند العمل مع كل من مُحرّك القوالب Jinja وإطار العمل Flask، في الدّروس القادمة، سنُكمل التّعرف على أساسيات مُحرّك القوالب لتتمكّن من تطوير تطبيقات Flask أفضل.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.