سؤال

أواجه مشكلة في معرفة كيفية إعداد إطار عمل الاختبار وقابل للاستخدام في Visual Studio 2008 لـ C++، مع مجموعة اختبار الوحدة المضمنة.

سيكون موضع تقدير أي روابط أو دروس.

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

المحلول

هذه الصفحة قد يكون مفيدًا، فهو يراجع عددًا لا بأس به من أطر اختبار وحدة C++:

  • وحدة المعالجة المركزية
  • اختبار
  • CppUnitLite
  • NanoCppUnit
  • الوحدة++
  • com.CxxTest

الدفع CPPUnitLite أو وحدة المعالجة المركزية (CPPUnitLite2)..

CPPUnitLite تم إنشاؤه بواسطة Michael Feathers، الذي قام في الأصل بنقل JUnit الخاص بـ Java إلى C++ باسم CPPUnit (يحاول CPPUnit تقليد نموذج تطوير JUnit - لكن C++ يفتقر إلى ميزات Java [على سبيل المثال.انعكاس] لتسهيل الاستخدام).

يحاول CPPUnitLite إنشاء إطار عمل اختبار بأسلوب C++ حقيقي، وليس إطار عمل Java تم نقله إلى C++.(أنا أعيد الصياغة من Feather's العمل بفعالية مع الكود القديم كتاب). وحدة المعالجة المركزية (CPPUnitLite2). يبدو أنها إعادة كتابة أخرى، مع المزيد من الميزات وإصلاحات الأخطاء.

أنا أيضا تعثرت للتو UnitTest++ والذي يتضمن أشياء من CPPUnitLite2 وبعض إطارات العمل الأخرى.

لقد أصدرت مايكروسوفت WinUnit.

الخروج أيضا يمسك أو دوكتيست

نصائح أخرى

توجد طريقة لاختبار لغة C++ غير المُدارة باستخدام إطار عمل الاختبار المدمج في Visual Studio 2008.إذا قمت بإنشاء مشروع اختبار C++، باستخدام C++/CLI، فيمكنك بعد ذلك إجراء مكالمات إلى DLL غير مُدار.سيتعين عليك تبديل دعم وقت تشغيل اللغة العامة إلى /clr من /clr:safe إذا كنت تريد اختبار التعليمات البرمجية التي تمت كتابتها بلغة C++ غير مُدارة.

لدي تفاصيل خطوة بخطوة على مدونتي هنا: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/

فيما يلي الطريقة التي أستخدمها لاختبار وحدة إعادة كتابة عنوان URL لـ IIS في Microsoft (وهي تعتمد على سطر الأوامر، ولكن يجب أن تعمل مع VS أيضًا):

  1. تأكد من أن ملفات الرأس الخاصة بك قابلة للاستهلاك عن طريق نقل التعليمات البرمجية المصدر إلى ملفات CPP واستخدام الإعلان الأمامي إذا لزم الأمر.
  2. قم بتجميع التعليمات البرمجية الخاصة بك لاختبارها كمكتبة (.lib)
  3. قم بإنشاء مشروع UnitTest الخاص بك كـ C++ مع دعم CLR.
  4. قم بتضمين ملفات الرأس الخاصة بك.
  5. قم بتضمين ملفات .lib الخاصة بك.
  6. إضافة مرجع إلى Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. استخدم فئة صغيرة حقًا للإعلان عن اختبار الوحدة الخاصة بك والانتقال من التعليمات البرمجية المُدارة إلى C++/Native مثل هذا (قد يحتوي على أخطاء مطبعية):

هنا مثال:

// Example
#include "stdafx.h"
#include "mstest.h"

// Following code is native code.
#pragma unmanaged
void AddTwoNumbersTest() {
  // Arrange
  Adder yourNativeObject;
  int expected = 3;
  int actual;
  // Act
  actual = yourNativeObject.Add(1, 2);
  // Assert
  Assert::AreEqual(expected, actual, L"1 + 2 != 3");
}

// Following code is C++/CLI (Managed)
#pragma managed
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;
[TestClass]
public ref class TestShim {
public:
  [TestMethod]
  void AddTwoNumbersTest() {
     // Just jump to C++ native code (above)
     ::AddTwoNumbersTest();
  }
};

باستخدام هذا النهج، لن يضطر الأشخاص إلى تعلم الكثير من عناصر C++/CLI، وسيتم إجراء الاختبار الحقيقي بالكامل بلغة C++ الأصلية وسيتم استخدام فئة TestShim "لنشر" الاختبار على MSTest.exe (أو جعله مرئيًا). ).

لإضافة اختبارات جديدة، ما عليك سوى الإعلان عن طريقة جديدة [TestMethod] فارغة NewTest(){::NewTest();} ووظيفة أصلية جديدة فارغة NewTest().لا توجد وحدات ماكرو، ولا حيل، ومباشرة.

الآن، أصبح ملف الرأس اختياريًا، ولكن يمكن استخدامه لكشف أساليب فئة Assert باستخدام التوقيعات الأصلية لـ C++ (على سبيل المثال.wchar_t* بدلاً من Stirng^)، حتى تتمكن من إبقائه قريبًا من C++ وبعيدًا عن C++/CLI:

هنا مثال:

// Example
#pragma once
#pragma managed(push, on)
using namespace System;
class Assert {
public:
    static void AreEqual(int expected, int actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    static void AreEqual(int expected, int actual, PCWSTR pszMessage) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual, gcnew String(pszMe
ssage));
    }

    template<typename T>
    static void AreEqual(T expected, T actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    // Etcetera, other overloads...
}
#pragma managed(pop)

هث

أنا شخصياً أفضل ذلك WinUnit لأنه لا يتطلب مني ذلك أكتب أي شيء باستثناء اختباراتي (أقوم بإنشاء ملف .dll كاختبار، وليس ملف exe).أنا فقط أقوم بإنشاء مشروع، وأشر WinUnit.exe إلى دليل مخرجات الاختبار الخاص بي ويقوم بتشغيل كل ما يجده.أنت تستطيع قم بتنزيل مشروع WinUnit هنا.(يتطلب MSDN منك الآن تنزيل الإصدار بأكمله، وليس المقالة.يتم تضمين WinUnit داخل.)

الإطار المتضمن مع VS9 يكون .NET، ولكن يمكنك كتابة الاختبارات بلغة C++/CLI، لذا طالما أنك مرتاح لتعلم بعض مبادئ .NET، فمن المفترض أن تكون قادرًا على اختبار معظم أكواد C++.

Boost.testو com.googletestتبدو متشابهة إلى حد ما، ولكنها مكيفة لاستخدامات مختلفة قليلاً.يحتوي كلاهما على مكون ثنائي، لذا ستحتاج إلى مشروع إضافي في الحل الخاص بك لتجميع الاختبارات وتشغيلها.

الإطار الذي نستخدمه هو com.CxxTest, وهو أخف بكثير؛إنها رؤوس فقط، وتستخدم برنامج Perl (!) النصي لاستخراج معلومات مجموعة الاختبار من رؤوسك (المجموعات ترث من CxxTest::Base، جميع أسماء طرق الاختبار الخاصة بك تبدأ بـ "اختبار").من الواضح أن هذا يتطلب الحصول على لغة Perl منها مصدر واحد أو آخر, ، مما يضيف الحمل إلى إعداد بيئة البناء الخاصة بك.

أنا أستعمل UnitTest++.

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

أشك في أنه سيظل يعمل مع Visual Studio 6 حيث يتم الآن إنشاء ملفات المشروع عبر CMake.إذا كنت لا تزال بحاجة إلى دعم الإصدار الأقدم، فيمكنك الحصول على الإصدار الأخير المتاح ضمن سورس فورج فرع.

الأدوات المذكورة هنا كلها أدوات سطر الأوامر.إذا كنت تبحث عن حل أكثر تكاملاً، قم بإلقاء نظرة عليه ستوديو سي فيكس, ، وهو Visual Studio AddIn لاختبار وحدة C/C++.إنه مشابه تمامًا لـ TestDriven.Net، لكنه مخصص لـ C/C++ (غير المُدار) بدلاً من .NET.

لقد استخدمت وحدة المعالجة المركزية مع VS2005 والكسوف.الويكي شامل للغاية (خاصة إذا كنت معتادًا على JUnit).

لست متأكدًا بنسبة 100% من VS2008، لكنني أعلم أن إطار عمل اختبار الوحدات الذي قدمته Microsoft في VS2005 كجزء من Team Suite كان مخصصًا لـ .NET فقط، وليس C++

لقد استخدمت CppUnit أيضًا وكان الأمر جيدًا.يشبه إلى حد كبير NUnit/JUnit/so on.

إذا كنت قد استخدمت التعزيز، فإنها لديها أيضًا مكتبة اختبار الوحدة

الرجال الذين يقفون وراء التعزيز لديهم بعض جاد قطع البرمجة، لذلك أود أن أقول أن إطار العمل الخاص بها يجب أن يكون جيدًا جدًا، ولكنه قد لا يكون الأكثر سهولة في الاستخدام :-)

أنا أحب CxxTest أيضًا لنفس الأسباب.إنه ملف رأس فقط لذا لا يلزم الارتباط.أنت لست عالقًا مع لغة Perl نظرًا لوجود عداء Python أيضًا.سأقوم بمراجعة مكتبة جوجل قريبا.تسحب عناصر Boost الكثير من الأمتعة الأخرى.

إن أداة اختبار الوحدة لبرنامج Visual Studio 2008 مخصصة فقط لرمز .NET على حد علمي.

لقد استخدمت CppUnit في Visual Studio 2005 ووجدته جيدًا جدًا.

بقدر ما أتذكر، كان الإعداد غير مؤلم نسبيا.فقط تأكد من أن الرابط (Linker → Input → إضافي التبعيات الإضافية) يتضمن cppunitd.lib في مشاريع الاختبار الخاصة بك.

ثم، #include <cppunit/extensions/HelperMacros.h> في رأسك.

يمكنك بعد ذلك اتباع الخطوات الواردة في http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html للحصول على فصل الاختبار الخاص بك يعمل.

كنت أعاني من تنفيذ اختبار الوحدة لتطبيق C++ غير مُدار في بيئة Windows باستخدام Visual Studio.لذلك تمكنت من التغلب على هذا الأمر وكتبت منشورًا كإرشادات خطوة بخطوة لاختبار وحدة تطبيق C++ غير المُدارة.آمل أن يكون قد يساعدك.

اختبار الوحدة لـ C++ غير المُدار في Visual Studio

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