اختبار الوحدة لكود C++ - الأدوات والمنهجية [مغلق]

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

  •  01-07-2019
  •  | 
  •  

سؤال

أنا أعمل على نظام c++ كبير قيد التطوير منذ عدة سنوات.كجزء من الجهود المبذولة لتحسين جودة الكود الحالي، شاركنا في مشروع كبير لإعادة البناء على المدى الطويل.

هل تعرف أداة جيدة يمكن أن تساعدني في كتابة اختبارات الوحدة في C++؟ربما شيء مشابه لجونيت أو نونيت؟

هل يمكن لأي شخص تقديم بعض النصائح الجيدة حول منهجية كتابة اختبارات الوحدة للوحدات التي تمت كتابتها دون وضع اختبار الوحدة في الاعتبار؟

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

المحلول

كان تطبيق اختبارات الوحدة على الكود القديم هو الحل سبب جدا العمل بفعالية مع الكود القديم كتب.مايكل فيذرز هو المؤلف - كما هو مذكور في الإجابات الأخرى، فقد شارك في إنشاء كليهما وحدة المعالجة المركزية و CppUnitLite.

alt text

نصائح أخرى

أصدرت Google مؤخرًا مكتبتها الخاصة لاختبار وحدة تطبيقات C++، والتي تسمى Google Test.

المشروع على كود جوجل

تحقق من ممتاز مقارنة بين العديد من الأجنحة المتاحة.تطور مؤلف هذا المقال لاحقًا UnitTest++.

ما يعجبني بشكل خاص فيه (بصرف النظر عن حقيقة أنه يتعامل مع الاستثناءات وما إلى ذلك).حسنًا) هو أن هناك قدرًا محدودًا جدًا من "الإدارة" حول حالات الاختبار وتعريف تركيبات الاختبار.

دفعة لديه مكتبة الاختبارات الذي يحتوي على دعم لاختبار الوحدة.قد يكون من المفيد التحقق من ذلك.

نويل لوبيس ألعاب من الداخل هو مؤلف استكشاف غابة إطار عمل اختبار وحدة C++, ، تقييم شامل (ولكنه قديم) لمختلف أطر اختبار وحدة C++، بالإضافة إلى كتاب عن برمجة الألعاب.

لقد استخدم CppUnitLite لفترة طويلة، لإصلاح أشياء مختلفة، لكنه في النهاية انضم إلى مؤلف آخر لمكتبة اختبار الوحدة، وأنتج UnitTest++.نحن نستخدم UnitTest++ هنا، وقد أحببته كثيرًا حتى الآن.لديها (بالنسبة لي) توازن القوى الصحيح مع بصمة صغيرة.

لقد استخدمت حلولًا محلية، مثل CxxTest (الذي يتطلب لغة Perl)، وboost::test.عندما قمت بتنفيذ اختبار الوحدة هنا في وظيفتي الحالية، كان الأمر يتعلق إلى حد كبير بـ UnitTest++ vs boost::test.

تعجبني حقًا معظم مكتبات التعزيز التي استخدمتها، لكن IMHO، Boost::test ثقيل جدًا بعض الشيء.لم يعجبني بشكل خاص أن الأمر يتطلب منك (AFAIK) تنفيذ البرنامج الرئيسي لأداة الاختبار باستخدام الماكرو Boost::test.أعلم أنه ليس TDD "خالصًا"، ولكن في بعض الأحيان نحتاج إلى طريقة لتشغيل الاختبارات من خلال تطبيق واجهة المستخدم الرسومية، على سبيل المثال عندما يتم تمرير علامة اختبار خاصة في سطر الأوامر، ولا يمكن أن يدعم Boost::test هذا النوع من السيناريو.

كان UnitTest++ هو أبسط إطار عمل للاختبار تم إعداده واستخدامه والذي واجهته في تجربتي (المحدودة).

أنا أستخدم الممتاز اختبار مكتبة بالتزامن مع مكتبة أقل شهرة ولكنها رائعة جدًا سلحفاة مكتبة :مكتبة كائنات وهمية تعتمد على التعزيز.

كمثال للتعليمات البرمجية يتحدث بشكل أفضل من الكلمات، تخيل أنك ترغب في اختبار a calculator الكائن الذي يعمل على view الواجهة (هذا هو المثال التمهيدي لـ Turtle):

// declares a 'mock_view' class implementing 'view'
MOCK_BASE_CLASS( mock_view, view )
{
    // implements the 'display' method from 'view' (taking 1 argument)
    MOCK_METHOD( display, 1 )                   
};

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero )
{
    mock_view v;
    calculator c( v );

    // expects the 'display' method to be called once with a parameter value equal to 0
    MOCK_EXPECT( v, display ).once().with( 0 ); 

    c.add( 0, 0 );
}

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

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

  • رأس فقط
  • التسجيل التلقائي للاختبارات القائمة على الوظيفة والطريقة
  • يقوم بتحليل تعبيرات C++ القياسية إلى LHS وRHS (لذلك لا تحتاج إلى مجموعة كاملة من وحدات الماكرو المؤكدة).
  • دعم الأقسام المتداخلة داخل تركيبات تعتمد على الوظيفة
  • اختبارات الأسماء باستخدام اللغة الطبيعية - يتم إنشاء أسماء الوظائف/الطرق

كما أن لديها روابط Objective-C.

com.CxxTest هو إطار عمل خفيف وسهل الاستخدام ومتعدد المنصات JUnit/CppUnit/xUnit لـ C++.

CppUnit هو الطريق.انظر الرابط أدناه:

http://cppunit.sourceforge.net/cppunit-wiki

http://en.wikipedia.org/wiki/CppUnit

UnitTest++, صغيرة وبسيطة.

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

توصلت إلى القائمة التالية (تقريبًا) مرتبة حسب النشاط، أعلى نشاط في الأعلى:

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

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

  • اختبار CppUT: يوفر الاختبار والسخرية.كان هذا المشروع نشطًا من عام 2008 إلى عام 2015 ولديه الكثير من الأنشطة الحديثة.كان هذا الاكتشاف مفاجئًا بعض الشيء لأن الكثير من المشاريع ذات النشاط الأقل تظهر بشكل متكرر عند البحث على الويب (مثل CppUnit الذي تم تحديثه الأخير في عام 2013).لم أتعمق في هذا الأمر لذا لا أستطيع أن أقول أي شيء عن التفاصيل.تحرير (16.12.2015): لقد جربت ذلك مؤخرًا ووجدت أن إطار العمل هذا أخرق بعض الشيء و"أنيق على طراز C"، خاصة عند استخدام الفئات الوهمية.ويبدو أيضًا أن لديها مجموعة أصغر من التأكيدات مقارنة بالأطر الأخرى.أعتقد أن قوتها الرئيسية تكمن في إمكانية استخدامها مع مشاريع لغة C البحتة.

  • اختبار كيو: مكتبة الاختبار التي تأتي مع إطار عمل Qt.يجب ضمان الصيانة لبعض الوقت، لكنني أستخدمها بدلاً من ذلك كمكتبة داعمة، لأن تسجيل الاختبار هو IMO أكثر خرقاء من الأطر الأخرى.بقدر ما أفهمه، فإنه يفرض عليك إجراء اختبار واحد لكل تركيبة اختبار.لكن وظائف مساعد الاختبار يمكن أن تكون ذات فائدة جيدة عند اختبار كود Qt-Gui.ليس لديها أي يسخر.

  • يمسك: لديها نشاط حديث ولكن تم تطويرها بشكل أساسي بواسطة شخص واحد.الشيء الجميل في هذا الإطار هو أسلوب التثبيت البديل الذي يتيح لك كتابة كود التثبيت القابل لإعادة الاستخدام في الاختبار نفسه.كما يتيح لك أيضًا تعيين أسماء الاختبار كسلاسل وهو أمر جيد عندما تميل إلى كتابة جمل كاملة كأسماء اختبار.أتمنى أن يتم نسخ هذا النمط ووضعه في googleTest ؛-)

أطر وهمية

عدد الأطر الوهمية أقل بكثير من عدد أطر الاختبار ولكن إليك تلك التي وجدت أن لها نشاطًا حديثًا.

  • فرس النهر:نشط منذ عام 2008 حتى الآن ولكن بكثافة منخفضة فقط.

  • زوره:نشط منذ عام 2013 حتى الآن ولكن تم تطويره بشكل أو بآخر بواسطة شخص واحد.

خاتمة

إذا كانت قاعدة التعليمات البرمجية الخاصة بك موجودة على المدى الطويل، فاختر من بين اختبار التعزيز + السلحفاة و جوجل تيست + جوجل موك.أعتقد أن هذين سيكون لهما صيانة طويلة المدى.إذا كان لديك قاعدة تعليمات برمجية قصيرة العمر فقط، فيمكنك تجربتها يمسك الذي لديه بناء جملة لطيف.إذن ستحتاج أيضًا إلى اختيار إطار عمل ساخر.إذا كنت تعمل مع Visual Studio، فيمكنك تنزيل محولات اختبار التشغيل لـ BoostTest وGoogleTest، والتي ستسمح لك بإجراء الاختبارات باستخدام واجهة المستخدم الرسومية لمشغل الاختبار المدمجة في VS.

راجع أيضًا إجابات السؤال ذي الصلة الوثيقة "اختيار أداة/إطار عمل اختبار وحدة c++"، هنا

هناك أيضا توت, ، اختبار وحدة القالب، وهو إطار عمل قائم على القالب.تركيبها غريب (يطلق عليها البعض إساءة استخدام القالب)، لكن ميزتها الرئيسية هي أنها تحتوي على كل شيء في ملف ملف رأس واحد.

ستجد مثال على اختبار الوحدة المكتوب باستخدام TUT هنا.

لقد قمت بتجريب CPPunit وهي ليست سهلة الاستخدام للغاية.

البديل الوحيد الذي أعرفه هو استخدام C++.NET لتغليف فئات C++ الخاصة بك وكتابة اختبارات الوحدات باستخدام أحد أطر اختبار وحدات .NET (NUnit، MBUnit وما إلى ذلك)

CppUTest يعد إطارًا ممتازًا وخفيف الوزن لاختبار وحدات C وC++.

كان لمايكل فيذرز من ObjectMentor دور فعال في تطوير كل من CppUnit وCppUnitLite.

وهو يوصي الآن CppUnitLite

القي نظرة على CUnitWin32.إنه مكتوب لـ MS Visual C.ويتضمن مثالا.

ألقِ نظرة على cfix (http://www.cfix-testing.org)، فهو متخصص في تطوير Windows C/C++ ويدعم كلاً من وضع المستخدم واختبار وحدة وضع kernel.

إذا كنت تستخدم Visual Studio 2008 SP1، فإنني أوصي بشدة باستخدام MSTest لكتابة اختبارات الوحدة.ثم أستخدم Google mock لكتابة النماذج.يعد التكامل مع IDE مثاليًا ويسمح ولا يحمل العبء الإضافي لـ CPPunit من حيث تحرير ثلاثة أماكن لإضافة اختبار واحد.

أظن VisualAssert يقوم بعمل رائع في تكامل VS.فهو يتيح لك تشغيل الاختبارات وتصحيحها من VS ولا تحتاج إلى إنشاء ملف قابل للتنفيذ لتشغيل الاختبارات.

تحقق من الفركتوز: http://sourceforge.net/projects/fructose/

إنه إطار عمل بسيط جدًا، يحتوي فقط على ملفات رأسية وبالتالي يسهل حمله.

أنا أستخدم اختبار MS مع المعزل Typemock++.جربها!

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