تكرار السؤال: …
الإجابة المختصرة
بدلاً من فحص أمثلة ومدخلات محددة يكتبها المبرمج يدوياً، يحدد المبرمج خصائص عامة صادقة دائماً (Invariants) وتقوم أداة الاختبار بتوليد مئات الآلاف من المدخلات العشوائية والمتطرفة لاكتشاف أي كسر لتلك الخصائص.
الشرح
في Example-based Testing، تفحص: sort([3, 1, 2]) == [1, 2, 3]. في Property-based Testing (مثل مكتبات QuickCheck أو Fast-Check)، نحدد الخصائص: (1) طول المصفوفة المرتبة يجب أن يطابق المصفوفة الأصلية. (2) كل عنصر يجب أن يكون <= العنصر التالي له. (3) كل عنصر في المصفوفة الأصلية موجود في الناتجة. تقوم الأداة بتوليد مصفوفات فارغة، سالبة، ضخمة، أو مكررة، وإذا وجدت خطأً، تقوم بتقليص المدخلات (Shrinking) للوصول لأصغر مدخل يسبب الانهيار.
مثال بالكود
import zlib
from hypothesis import given, strategies as st
@given(st.binary())
def test_roundtrip(data):
assert zlib.decompress(zlib.compress(data)) == data # property: decompress(compress(x)) == x
@given(st.lists(st.integers()))
def test_sort_is_idempotent(xs):
assert sorted(sorted(xs)) == sorted(xs)
# Hypothesis generates hundreds of inputs (empty, huge, negative, duplicates…) and shrinks a failure
# to the smallest counter-example.أخطاء شائعة
- الاعتماد فقط على الأمثلة الإيجابية السعيدة (Happy Path) وتجاهل القيم القصوى والرموز الخاصة والأرقام السالبة والقيم الفارغة.