القضبان الاختبار:تركيبات المصانع و الأرقام السحرية

StackOverflow https://stackoverflow.com/questions/227973

سؤال

لدي تطبيق يحتاج قليلا جدا من البيانات (1000s من السجلات) للقيام الاختبارات المناسبة.الطريقة الوحيدة التي وجدتها على لائق مجموعة من قابل للاختبار ، معقولة البيانات هو استخدام مجموعة فرعية من إنتاج DB.لقد تحول هذا إلى YAML المباريات العادية `اختبار/تركيبات الموقع.

يعمل هذا, ولكن الآن لدي مجموعة من تبدو هشة الاختبارات التأكيدات التي تعتمد على وجودهم عدد معين من السجلات التي تحقق الشرط X...

على سبيل المثال

def test_children_association
  p = Parent.find(1)
  assert_equal 18, p.children.count, "Parent.children isn't providing the right records"
end

هذا لا يبدو مثل فكرة جيدة بالنسبة لي ، ولكن أنا لست متأكدا مما إذا كان هناك من هو أفضل / قبول طريقة اختبار التطبيق الذي يحتاج إلى كبير الهرمي من البيانات.

هل كانت مفيدة؟

المحلول

الأرقام السحرية في الاختبارات ليست مضاد نمط.الاختبارات الخاصة بك بحاجة إلى أن يكون ذلك الميت البسيطة التي لا تحتاج إلى اختبار لهم.وهذا يعني سيكون لديك بعض الأرقام السحرية.وهذا يعني أن الاختبارات سوف كسر عند تغيير قطع صغيرة من الوظائف.هذا أمر جيد.

لقد تركيبات بعض المشاكل, ولكن هناك بضعة أشياء بسيطة يمكنك القيام به لجعلها أسهل للعمل مع:

  1. فقط بيانات خط الأساس في تركيب هذا النوع من البيانات أن معظم الاختبارات الخاصة بك تحتاج ولكن لا يهمني.هذا سوف تنطوي على استثمار الوقت في خط الهجوم ، ولكن من الأفضل أن تأخذ الألم في وقت مبكر من كتابة الفقراء وحدة اختبارات حياة المشروع.

  2. إضافة البيانات إلى اختبار في سياق اختبار.هذا يحسن القراءة من الاختبارات الخاصة بك ويوفر لك من كتابة "تأكد لا أحد افسدت المباريات" التعقل الشيكات في بداية وحدة الاختبارات.

نصائح أخرى

فإن أول شيء أود أن أقوله هو:ما أنت اختبار في هذا المثال ؟ إذا كان عادي ع has_many الرابطة, ثم لا يكلف نفسه عناء الكتابة اختبار لذلك.كل ما تفعلونه هو الاختبار الذي يعمل AR.

أفضل مثال قد يكون إذا كان معقد جدا الاستعلام أو إذا كان هناك معالجة أخرى تشارك في الحصول على قائمة من الأطفال السجلات.عندما يمكنك الحصول عليها مرة أخرى بدلا من اختبار العد يمكنك تكرار خلال عاد قائمة التحقق من أن الأطفال تطابق المعايير التي تستخدمها.

ما وجدتها مفيدة للغاية في هذه الحالة لا يستخدم المباريات على الإطلاق وإنما بناء كائنات قاعدة البيانات على الطاير مثل

def test_foo
   project = Project.create valid_project.merge(....)
   *do assertions here*
end

و في test_helpers علي مجموعة من الأساليب:

def valid_project
   { :user_id => 23, :title => "My Project" }
end

def invalid_project
   valid_project.merge(:title => nil)
end

لقد وجدت أن الألم من الحاجة إلى بناء مجموعات ضخمة من اختبار الأجسام أدى لي بطبيعة الحال إلى تصميم أكثر بساطة وأكثر تنوعا من الدرجة الهياكل.

كاميرون صحيح:ما أنت الاختبار ؟

ما نوع النظام يحتاج 1000s من السجلات الحالية إلى اختبار ؟ تذكر الاختبارات الخاصة بك ينبغي أن تكون صغيرة قدر الإمكان و يجب أن يكون اختبار سلوك التطبيق.محال فإنه يحتاج الآلاف من سجلات الغالبية العظمى من تلك الاختبارات.

على قطع صغيرة من السلوك الاختبارات حيث كنت في حاجة الكائن العلاقات النظر في كائنات وهمية.عليك فقط أن speccing محدد الحد الأدنى من السلوك الضروري الحصول على اختبار لتمرير ، وأنها لن تصل DB في كل شيء ، وهو مبلغ ضخم كسب الأداء في اختبار جناح.وأسرع هو إلى تشغيل المزيد من الناس في كثير من الأحيان تشغيله.

قد يكون حالة فريدة من نوعها هنا, ولكن أنا حقا بحاجة إلى قليل من سجلات اختبار هذا التطبيق (حصلت عليه إلى 150 أو نحو ذلك).أنا تحليل البيانات التاريخية و العديد من المستويات has_many.بعض طرق مخصصة استعلامات SQL عبر العديد من الجداول التي كنت قد ينتهي تعديل استخدام ActiveRecord.find ولكن أنا في حاجة إلى الحصول على اختبار الجري الأول.

على أية حال لقد انتهى الأمر باستخدام بعض روبي البرمجية لإنشاء تركيبات.التعليمات البرمجية المضمنة في بلدي test_helper;فإنه يتحقق الاختبار DB لمعرفة ما إذا كانت البيانات التي لا معنى لها (على أساس الوقت شرط) و مناديل بإعادة الوثائق الإجرائية.في هذه الحالة, خلق له من الناحية الإجرائية تسمح لي أن أعرف ماذا البيانات أنا اختبار يجب أن وهو أكثر أمانا من استخدام مجموعة فرعية من بيانات الإنتاج وعلى أمل الأرقام احسب المرة الأولى هي ما يجب أن اختبار في المستقبل.

كما انتقلت إلى استخدام يجب والتي جنبا إلى جنب مع العديد من الأشياء الأخرى المفيدة يجعل ActiveRecord جمعية الاختبار سهلا كما:

should_have_many :children
should_belong_to :parent
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top