مقدمة
الاختبارات التقليدية تتحقق من أن الدالة تعمل بشكل صحيح مع قيم محددة. لكن ماذا لو كنت لا تعرف مسبقًا أي المدخلات ستؤدي إلى خطأ؟ هنا يأتي دور Hypothesis – الاختبار التوليدي الذي يحل هذه المشكلة تلقائيًا.
Hypothesis هي مكتبة قوية للاختبار القائم على الخصائص (property-based testing) في Python، تغير جذريًا طريقة تفكيرك في الاختبار. بدلاً من إنشاء بيانات الاختبار يدويًا، تقوم بتوليد آلاف القيم المختلفة تلقائيًا، سعيًا لاكتشاف الحالات الشاذة والحدودية والخاطئة. بدلاً من كتابة عشرات الاختبارات بقيم محددة، تصف الخصائص والقواعد الثابتة للدالة، وتحاول Hypothesis انتهاكها.
ما هي Hypothesis
Hypothesis هي أداة اختبار توليدي مبنية على مفهوم الاختبار القائم على الخصائص. صُممت هذه المكتبة لحل المشكلة الأساسية في الاختبار التقليدي: استحالة توقع جميع المدخلات الممكنة.
مبادئ العمل الأساسية
تعمل المكتبة على مبدأ "إيجاد مثال مضاد". عندما تحدد خاصية لدالة (مثل أن ناتج جمع عددين موجبين دائمًا أكبر من كل منهما)، تقوم Hypothesis بتوليد مجموعة متنوعة من المدخلات والتحقق من تحقق الخاصية لكل مجموعة.
المزايا مقارنة بالاختبار التقليدي
- تغطية تلقائية للحالات الحدودية: تكتشف Hypothesis تلقائيًا التركيبات النادرة والمعقدة للبيانات
- تقليل الأخطاء: عند اكتشاف فشل اختبار، يتم تبسيطه تلقائيًا إلى أصغر مثال مسبب للخطأ
- أداء عالٍ: توليد آلاف حالات الاختبار يتم بسرعة فائقة
- قابلية إعادة الإنتاج: يمكن إعادة إنتاج الأخطاء المكتشفة بسهولة
التثبيت والخطوات الأولى
تثبيت المكتبة
pip install hypothesis
لإمكانيات إضافية، يمكن التثبيت مع الإضافات:
pip install hypothesis[numpy,pandas,django]
مثال أساسي للاستخدام
from hypothesis import given
import hypothesis.strategies as st
@given(st.integers(), st.integers())
def test_addition_commutative(a, b):
assert a + b == b + a
@given(st.integers(), st.integers())
def test_addition_associative(a, b, c):
assert (a + b) + c == a + (b + c)
تشغيل الاختبارات
يمكن تشغيل الاختبارات عبر pytest أو unittest أو مباشرة:
pytest test_file.py
python -m unittest test_file.py
python test_file.py
أساسيات توليد البيانات
المزين @given
المزين @given() هو العنصر الأساسي في Hypothesis. يحدد استراتيجيات التوليد التي ستستخدم لإنشاء بيانات الاختبار.
@given(st.integers())
def test_absolute_value(x):
assert abs(x) >= 0
@given(st.text(), st.integers(min_value=0))
def test_string_multiplication(s, n):
result = s * n
assert len(result) == len(s) * n
وحدة hypothesis.strategies
جميع استراتيجيات توليد البيانات موجودة في وحدة hypothesis.strategies، والتي يتم استيرادها عادةً كـ st. توفر هذه الوحدة مجموعة غنية من الاستراتيجيات المحددة مسبقًا لأنواع البيانات المختلفة.
استراتيجيات توليد البيانات
الاستراتيجيات الأساسية
توفر Hypothesis مجموعة واسعة من الاستراتيجيات المضمنة لتوليد أنواع مختلفة من البيانات:
# الأنواع الرقمية
st.integers() # الأعداد الصحيحة
st.floats() # الأعداد العشرية
st.decimals() # الأعداد العشرية الدقيقة
# البيانات النصية
st.text() # سلاسل Unicode
st.binary() # السلاسل البايتية
st.characters() # الأحرف الفردية
# منطق