يسخر من الأساليب غير الذروة في C ++ دون تحرير رمز الإنتاج؟

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

سؤال

أنا مطور برامج جديد إلى حد ما يعمل حاليًا لإضافة اختبارات الوحدة إلى مشروع C ++ الحالي الذي بدأ منذ سنوات. نظرًا لسبب غير تقني ، لا يُسمح لي بتعديل أي رمز موجود. تحتوي الفئة الأساسية لجميع وحداتاتي على مجموعة من الطرق لإعداد/الحصول على البيانات والتواصل مع الوحدات النمطية الأخرى.

نظرًا لأنني أرغب فقط في اختبار كل وحدة فردية ، أريد أن أكون قادرًا على استخدام القيم المعلبة لجميع أساليب الاتصال بين الوحدات. IE للطريقة ping () التي تتحقق مما إذا كانت وحدة أخرى نشطة ، أريد أن أعود صحيحًا أو خطأ بناءً على نوع الاختبار الذي أقوم به. لقد كنت أبحث في Google Test و Google Mock ، وهو يدعم أساليب غير قابلة للرياضة. لكن النهج الموصوف (http://code.google.com/p/googlemock/wiki/Cookbook#mocking_nonvirtual_methods) يتطلب مني "تعامل" الأساليب الأصلية التي يجب أن تأخذها إما كائنات حقيقية أو وهمية. لا يمكنني الذهاب وأخذ أساليب في الفصل الأساسي بسبب المتطلبات المذكورة سابقًا ، لذلك أحتاج إلى طريقة أخرى لسخرية هذه الأساليب الافتراضية

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

سأكون أقدر أي نصيحة!

شكرًا،

JW

تحرير: أمثلة أكثر واقعية

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

في Leafmodule ، أريد اختبار طريقة Dostuff () ، والتي تسمي GetStatus غير الظاهرية (Modulename) المحددة في فئة الجذر. أحتاج إلى جعل GetStatus () بطريقة ما لإرجاع قيمة معلبة مختارة. السخرية جديدة بالنسبة لي ، وكذلك استخدام الكائنات الوهمية حتى النهج الصحيح؟

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

المحلول

أود أن أكتب نصًا Perl/Ruby/Python لقراءة في شجرة المصدر الأصلية وكتابة شجرة مصدر مسيرة في دليل مختلف. ليس عليك تحليل C ++ بالكامل من أجل استبدال تعريف الوظيفة.

نصائح أخرى

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

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

الخيار الثالث الذي قد يكون قابلاً للاستخدام هو استخدام إطار عمل يسخر يتيح لك السخرية من الوظائف غير الذروة. أنا مؤلف كتاب Hippomocks (إخلاء المسئولية فيما يتعلق بالحياد وما إلى ذلك) وقد أضفنا مؤخرًا القدرة على السخرية من وظائف C العادية على منصات X86. يمكن تمديد هذا إلى وظائف الأعضاء غير الذروة مع القليل من العمل وسيكون ما تبحث عنه. ضع في اعتبارك أنه إذا تمكن المترجم الخاص بك من رؤية كل من استخدام الوظيفة وتعريفها في وقت واحد قد تضمنها وأن السخرية قد تفشل. هذا ينطبق بشكل خاص على الوظائف التي يتم تعريفها في الرؤوس.

إذا كانت الدالة C العادية كافية لك ، فيمكنك استخدامها كما هي الآن.

سيكون أحد النهج هو تحديد مصادر مختلفة للاختبار. قل أن هدف الإنتاج الخاص بك يستخدم rootmodule.h و rootmodule.cpp. استخدم مصادر مختلفة لهدف الاختبار. يمكنك تحديد رأس مختلف عن طريق تغيير مسار تضمينك ، بحيث يتم تحميل #include "RootModule.h" في الواقع unittest/rootmodule.h. ثم السخرية من الجذر على محتوى قلبك.

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