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