اتساق حقول الهوية هو الخاصية التي تجعل مجموعة من القيم المنتجة صالحة للاستعمال أصلا. فكل حقل في السجل قد يكون معقولا بمفرده بينما يصف السجل ككل شيئا مستحيلا—شارع في بلد، ورمز بريدي من بلد آخر، ورقم هاتف يخص بلدا ثالثا—وهذه بالضبط هي الحالة التي يكف فيها الاختبار عن قول الحقيقة.
يشرح هذا المقال كيف تنشأ السجلات غير المتسقة، ولماذا تسمح للاختبارات بالنجاح حين كان ينبغي أن تفشل، وما الذي يلزم لإبقاء مجموعة بيانات الاختبار متماسكة مع نموها.
لماذا تنتج الحقول الصحيحة منفردة سجلا خاطئا؟
العشوائية هي المتهم المعتاد، ومن غير البديهي مدى سرعتها في إنتاج الكلام الفارغ. اسحب بلدا، ثم اسحب مدينة باستقلال عنه، فيختلف الاثنان باحتمال قريب من الواحد. كل قيمة مسحوبة من المجموعة الصحيحة؛ ولا شيء فيها مشوه؛ والتركيبة ببساطة لا تحدث أبدا.
وتفشل السجلات المبنية يدويا بطريقة مختلفة لكن ليس أقل. فمن يكتبها يعمل عادة حقلا حقلا، ويفحص كل قيمة مقابل معرفته، ولا سبب لديه ليبقي البلد والتقسيم الإداري والرمز البريدي وبادئة الهاتف في ذهنه في الوقت نفسه. والنتيجة سجل يبدو متقنا وهو متناقض داخليا.
وهناك مصدر ثالث أهدأ من الاثنين: سجلات مجمعة من عدة مصادر. فقد يأخذ صف في بيئة التجهيز اسمه من بذرة، وعنوانه من ملف تجهيز، وبيانات اتصاله من الملف الذي كان مفتوحا عند كاتب الاختبار. وكل جزء كان سليما حيث جاء منه.
أين يتحول عدم الاتساق إلى نجاح زائف؟
تأمل قاعدة تقول إن على العميل أن يكون في سن معينة على الأقل لشراء منتج، واختبارا يفحص أن القاعدة تعمل. ومع تاريخ ميلاد في قرن وعمر مخزن من قرن آخر، قد يشغل الاختبار فرع القبول بينما كان ينبغي رفض السجل الذي يختبره—ولا شيء يبلغ عن مشكلة، لأن أي فحص لم يفشل.
البلد وشكل الرمز البريدي. يخفي كل التحقق من الرمز البريدي، لأن الرمز ما زال سليم الشكل.
البلد وبادئة الاتصال الهاتفي. يخفي منطق اللغة والتوجيه، الذي يرجع بصمت إلى قيمة افتراضية.
تاريخ الميلاد وحد العمر. يخفي بوابات العمر، فيثبت اختبار ناجح فقط أن مسار القبول يعمل.
العنوان وتنسيق المعرّف. يخفي التحقق من المعرّف، الذي يتخطى حين يكون البلد غامضا.
التقسيم الإداري ونطاق الرمز البريدي. يخفي تطبيع العناوين، إذ لا يمكن تطبيق أي قاعدة على تناقض.
والنمط واحد في كل سطر: عدم الاتساق يزيل المدخل الذي كان سيطلق الفشل. ومجموعة اختبارات مليئة بسجلات كهذه ليست ضعيفة لنقص التوكيدات؛ بل ضعيفة لأن مدخلاتها لا تصل أبدا إلى الفروع التي تسكنها التوكيدات.
هل ينبغي رفض البيانات غير المتسقة أم إصلاحها؟
يعتمد ذلك على من يحملها، والخطأ هنا يسبب ضررا خاصا به. فالبيانات الواردة من إنسان ينبغي إصلاحها حيث يكون المقصود واضحا والسؤال عنه حيث لا يكون، لأن إنسانا ينتظر. أما البيانات المنتجة وبيانات ملفات التجهيز فينبغي رفضها رفضا تاما، لأنه لا مقصود يمكن استعادته، والسجل المصلح يخفي العيب في الجهة التي أنتجته.
والقاعدة العملية لأي أداة إنشاء أن عدم الاتساق عيب في الأداة لا خاصية يمكن التسامح معها في المراحل اللاحقة. وأي شيء غير ذلك يدرب الفريق على كتابة شيفرة متسامحة ستلتقي لاحقا بمدخلات حقيقية وتبتلعها.
وللتحقق داخل المنتج، السؤال المفيد هو ما الذي ينبغي أن يفعله فحص الاتساق الفاشل بالسجل. الرمز البريدي الغائب فجوة في إدخال البيانات، ويمكن للمستخدم إصلاحها. أما الرمز البريدي الموجود الذي يخص منطقة أخرى فتناقض، ولن تحله أي إعادة محاولة من المستخدم من دون أن تتغير المنطقة أيضا. وهذان يستحقان معاملة مختلفة.
كم ينبغي أن تكون قاعدة الاتساق قوية؟
اجعلها ضعيفة قدر ما تستطيع مع بقائها ملتقطة للفشل المهم، وكن صريحا في تحديد قوتها. فالقواعد ثلاث درجات، وخلطها بلا وسم هو الطريق إلى شيفرة لا يستطيع أحد شرح تحققها.
- التحذير يسجل الاختلاف ويمرر السجل، وهو صحيح للعلاقات المستنتجة لا المعلنة.
- الرفض يمنع السجل، وهو صحيح حين يكون الاختلاف مستحيلا لا غريبا فقط.
- الإصلاح يعيد كتابة قيمة لتتفق مع أخرى، وهو أخطر الثلاثة وينبغي ألا يستخدم إلا حيث تكون الأولوية موثقة.
ومعظم الالتباس في هذا الباب يأتي من معاملة ارتباط إحصائي كقاعدة صلبة. فبادئة الهاتف تدل عادة على بلد، لكن ليس دائما؛ والرمز البريدي يدل عادة على منطقة، لكن المناطق الحدودية والاستثناءات موجودة. وترميز نزعة كتحريم يرفض أشخاصا حقيقيين، ويفعل ذلك غالبا مع المستخدمين الذين يقل شبههم بالافتراضات المضمنة في البيانات.
هل يجب أن تكون السجلات المنتجة متسقة عبر الدفعة كلها؟
داخل السجل الواحد نعم. أما عبر الدفعة فلا—وخلط الأمرين يهدر الجهد في اتجاه ويخلق عيوبا في الاتجاه الآخر. فدفعة من ألف سجل ينبغي أن تحمل تنوعا: مناطق مختلفة، وأشكال أسماء مختلفة، وفئات عمرية مختلفة، وبعض السجلات بحقول غائبة. ولا ينبغي أن تحمل ألف سجل يدعي كل واحد منها أنه الشخص نفسه.
وهناك سبب عملي لإبقاء الدفعات متنوعة داخليا. فالاختبار الذي يعمل على مئة سجل شبه متطابق يشغل مسارا برمجيا واحدا مئة مرة ويعلن النجاح. والاختبار نفسه على مئة سجل متنوع يشغل الفروع المهمة، وهذا ما تحاول تدريبات الحمل والترحيل إثباته فعلا.
والمكان الذي تحتاج فيه الدفعة إلى تجانس هو قابلية التكرار: المدخل نفسه ينبغي أن ينتج الدفعة نفسها، كي يمكن العثور على فشل وجد مرة أخرى. والسجلات المنتجة من أداة الهوية وبيانات الاختبار تحفظ هذه الخاصية باستخراج كل شيء من بذرة هوية، وهذا ما يتيح أن تكون الدفعة متنوعة وقابلة للإعادة في الوقت نفسه. وتبقى القيم سجلات وهمية للاختبار البرمجي لا تفاصيل أشخاص حقيقيين.
أي الأزواج تنكسر أكثر في الممارسة؟
أربعة أزواج تفسر معظم العيوب. البلد مع كتلة العنوان هي الأول، لأن أشكال العناوين هي أوضح جزء وطني في السجل. والبلد مع بادئة الهاتف هي الثاني، لأن رموز الاتصال قصيرة ويسهل تركها غير مرتبطة. وتاريخ الميلاد مع بوابة العمر هي الثالث، لأن البوابة تعبر عنها عادة بعدد لا بمقارنة. والبلد مع رقم الهوية هو الرابع، لأن رقما على شكل أرقام فقط يمر عبر فحص ضعيف في أي مكان.
ولكل واحد من هذه اختبار رخيص: أنشئ سجلا، وغيّر أحد طرفي الزوج بيدك، وتأكد من أن النظام يلاحظ. فإن لم يلاحظ، فالزوج لم يكن متحققا منه فعلا، والسجل الذي كان ينبغي أن يفشل كان ينجح طوال الوقت. ولهذا يبدأ التشخيص الحقيقي من سؤال أي حقل يقيد أي حقل، وهو السؤال نفسه الذي يطرحه دليل طول رقم الهوية الوطنية عند تصميم حقل المعرّف.
للمطورين: أين تفرض القواعد
أنشئ بترتيب التبعية وتحقق بالترتيب نفسه. البلد أولا، ثم التقسيم الإداري الذي ينتمي إليه، ثم كل ما يستخرج من هذين—العنوان والرمز البريدي وبادئة الهاتف وتنسيق المعرّف والعملة واللغة. وأداة الإنشاء التي تسحب الحقول بترتيب عرضها في النموذج ستنتج تناقضات، لأن ترتيب النموذج يتعلق بالعرض وترتيب البيانات يتعلق بالسببية.
وضع التحقق العابر للحقول في مكان واحد بدلا من نثره على النموذج وواجهة البرمجة وقاعدة البيانات. فالقواعد المكررة تنحرف، والنسخة المنحرفة هي دائما التي لا يقرؤها أحد. وانمذج كل زوج صراحة كي يرى المراجع أي قيمة تقيد أي قيمة، وأعط كل قاعدة وسم قوة كي يعرف القارئ اللاحق هل تمنع أم تحذر فقط.
ولملفات التجهيز، ضع سجلا غير متسق عن قصد إلى جانب السجلات الصحيحة—الشخص نفسه مع زوج واحد مكسور بالضبط—وأكد أن النظام يرفضه. وهذه الحالة الواحدة هي أثمن ملف تجهيز في المجموعة، لأنها الوحيدة التي تثبت أن قواعد الاتساق ما زالت مفعلة. ومرة أخرى، كل هذا بيانات وهمية للاختبار: ليست وصفا لأي إنسان حقيقي، ولا يجوز استخدامها للنيابة عنه.
الخطوات التالية
اكتب أزواج الحقول الخمسة التي يعتمد عليها منتجك وافحص كل واحد منها في الشيفرة؛ فإن لم يكن زوج مفروضا في أي مكان فهو مفترض لا متحقق منه. ثم اسحب دفعة من السجلات المنتجة من أداة الهوية ومررها عبر مسار ترحيل أو استيراد، وراقب الصفوف التي تنجح لسبب خاطئ. وتشرح مقالة ملفات تجهيز الاختبارات كيف تبقي سجلا معطوبا واحدا بشكل دائم في المجموعة كي لا تنتكس هذه الخاصية أبدا.