البدء مع CppUTest

طائر

14‏/05‏/2017

البريد الإلكتروني

1 min read

البدء مع CppUTest

النقاط الرئيسية

    • CppUTest هو إطار اختبار خفيف الوزن يتم صيانته بشكل نشط وفق نمط xUnit لاختبار C/C++، مع طبقة تكامل C تعمل بسلاسة حتى في أكواد C الثقيلة.

    • يمكنك تثبيته عبر مديري الحزم (توزيعات لينوكس، Homebrew) أو استنساخ مستودع GitHub.

    • يتكون الإعداد الأدنى من:

      • دليل الإنتاج src/،

      • دليل الاختبار t/،

      • قوم بتشغيل الاختبارات (CommandLineTestRunner)، و

      • وحدات الاختبار باستخدام كتل TEST_GROUP و TEST().

    • يوفر CppUTest MakefileWorker.mk كمساعد يبسّط بناء الاختبارات، وربط المكتبات، ومعالجة العلامات.

    • كشف تسريبات الذاكرة مفعل بشكل افتراضي من خلال إعادة تعريف malloc/free، مما يلتقط التسريبات داخل الكود المصدر المختبر.

    • تغطية الكود عبر gcov تتكامل بسهولة من خلال تفعيل CPPUTEST_USE_GCOV=Y، مما ينتج تقارير تغطية كاملة وملخصات HTML.

    • الإطار يتضمن ميزات متقدمة: المحاكاة، الإضافات، نصوص المساعدة، والتعاون المباشر مع C - مفيد للأكواد المعقدة في المؤسسات.

أهم النقاط في الأسئلة والأجوبة

  • ما هو CppUTest ولماذا نستخدمه؟

    إنه إطار اختبار قوي على طراز xUnit لـ C/C++ مع واجهة برمجة تطبيقات واضحة، وماكروهات تأكيد مدمجة، وكشف عن التسرب، وتطوير نشط - مثالي للأنظمة القديمة أو الحديثة.

  • كيف تُهيكل مشروعًا أساسيًا باستخدام CppUTest؟

    src/
      code/
        code.cpp
        code.h
      main.cpp
    t/
      main.cpp (test runner)
      test.cpp (test suite)
  • كيف يمكنك تشغيل جميع الاختبارات؟

    يستخدم عداء الاختبار:

    return CommandLineTestRunner::RunAllTests(ac, av);
  • كيف تبني اختبارات دون تكوين خيارات المترجم يدويًا؟

    استخدم MakefileWorker.mk من CppUTest، الذي يتعامل مع الأعلام، والربط، وتنفيذ الاختبارات تلقائيًا.

  • هل يمكن لـ CppUTest اكتشاف تسرب الذاكرة تلقائيًا؟

    نعم. إنه يتجاوز malloc/free أثناء عمليات البناء الاختبارية، ويبلغ:

    • أي اختبار تسرب،

    • أين حدث،

    • حجم التسرب ومحتويات الذاكرة.

    مثال على نتيجة الفشل:

    Memory leak(s) found.
    Allocated at: code.c line 6
    Leak size: 1
  • كيف يمكنني توليد تغطية الشيفرة؟

    1. تمكين: CPPUTEST_USE_GCOV=Y

    2. تأكد من توفر filterGcov.sh في $(CPPUTEST_HOME)/scripts/.

    3. شغّل: make gcov

      هذا ينتج .gcov ونص ملخص وتقارير تغطية بتنسيق HTML.

  • ماذا يمكن أن تفعل CppUTest بخلاف الاختبارات الأساسية؟

    • إطار العمل التخيلي

    • نظام الملحقات

    • نصوص أتمتة المساعدة

    • تكامل C الأصلي

    • ماكروز التأكيد الواسعة

  • من هو الأنسب لـ CppUTest؟

    الفرق التي تعمل مع الأنظمة المدمجة، ومنصات C، وخدمات C++، أو أي بيئة يجب التحقق من موثوقيتها وسلامة الذاكرة فيها بشكل مستمر.

في SparkPost، نولي الكثير من الوقت والجهد لاختبار رمزنا. منصتنا مكتوبة بلغة C، ومؤخراً بحثت في دمج مع إطار اختبار الوحدة الذي يسمى “CppUTest”، والذي يوفر اختباراً بأسلوب xUnit لـ C/C++. هذا الإطار قوي وغني بالميزات، ويخضع لتطوير نشط، مما يجعله خياراً ممتازاً. كما يوفر طبقة تكامل مع C، مما سهّل استخدامه مع رمز C الخاص بمنصتنا على الرغم من أن معظم الإطار مكتوب بلغة C++. تغطي هذه الدورة كيفية البدء باستخدام CppUTest في مشاريعك الخاصة.

في SparkPost، نولي الكثير من الوقت والجهد لاختبار رمزنا. منصتنا مكتوبة بلغة C، ومؤخراً بحثت في دمج مع إطار اختبار الوحدة الذي يسمى “CppUTest”، والذي يوفر اختباراً بأسلوب xUnit لـ C/C++. هذا الإطار قوي وغني بالميزات، ويخضع لتطوير نشط، مما يجعله خياراً ممتازاً. كما يوفر طبقة تكامل مع C، مما سهّل استخدامه مع رمز C الخاص بمنصتنا على الرغم من أن معظم الإطار مكتوب بلغة C++. تغطي هذه الدورة كيفية البدء باستخدام CppUTest في مشاريعك الخاصة.

في SparkPost، نولي الكثير من الوقت والجهد لاختبار رمزنا. منصتنا مكتوبة بلغة C، ومؤخراً بحثت في دمج مع إطار اختبار الوحدة الذي يسمى “CppUTest”، والذي يوفر اختباراً بأسلوب xUnit لـ C/C++. هذا الإطار قوي وغني بالميزات، ويخضع لتطوير نشط، مما يجعله خياراً ممتازاً. كما يوفر طبقة تكامل مع C، مما سهّل استخدامه مع رمز C الخاص بمنصتنا على الرغم من أن معظم الإطار مكتوب بلغة C++. تغطي هذه الدورة كيفية البدء باستخدام CppUTest في مشاريعك الخاصة.

هل ترغب في المزيد؟

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

آمل أن تساعد المعلومات هنا في تحسين جودة كود C/C++ الخاص بك باستخدام هذه الأداة الرائعة!

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

آمل أن تساعد المعلومات هنا في تحسين جودة كود C/C++ الخاص بك باستخدام هذه الأداة الرائعة!

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

آمل أن تساعد المعلومات هنا في تحسين جودة كود C/C++ الخاص بك باستخدام هذه الأداة الرائعة!

تنزيل CppUTest

صفحة مشروع CppUTest متاحة على الموقع الرسمي، والمستودع موجود على github. وهو أيضًا مدرج في مستودعات إدارة الحزم للعديد من توزيعات لينكس، وكذلك homebrew على نظام ماك. الأمثلة التي تلي تم تنفيذها على نظام ماك OS X، لكنها مستمدة من كود تم كتابته لنظام ريدهات، وهو نظام التشغيل الذي يعمل عليه منصتنا.

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

صفحة مشروع CppUTest متاحة على الموقع الرسمي، والمستودع موجود على github. وهو أيضًا مدرج في مستودعات إدارة الحزم للعديد من توزيعات لينكس، وكذلك homebrew على نظام ماك. الأمثلة التي تلي تم تنفيذها على نظام ماك OS X، لكنها مستمدة من كود تم كتابته لنظام ريدهات، وهو نظام التشغيل الذي يعمل عليه منصتنا.

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

صفحة مشروع CppUTest متاحة على الموقع الرسمي، والمستودع موجود على github. وهو أيضًا مدرج في مستودعات إدارة الحزم للعديد من توزيعات لينكس، وكذلك homebrew على نظام ماك. الأمثلة التي تلي تم تنفيذها على نظام ماك OS X، لكنها مستمدة من كود تم كتابته لنظام ريدهات، وهو نظام التشغيل الذي يعمل عليه منصتنا.

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

وضع الأساس

أولاً وقبل كل شيء، دعنا نكتب بعض الأكواد!

سيحتوي مشروع الاختبار الخاص بنا على ملف

أولاً وقبل كل شيء، دعنا نكتب بعض الأكواد!

سيحتوي مشروع الاختبار الخاص بنا على ملف

أولاً وقبل كل شيء، دعنا نكتب بعض الأكواد!

سيحتوي مشروع الاختبار الخاص بنا على ملف

ملف مشروع

سيكون ملف Makefile الخاص بالمشروع على نفس المستوى مثل دلائل ‘src’ و ‘t’ في جذر المشروع. يجب أن يبدو هكذا:

# Makefile

SRC_DIR = ./src
CODE_DIR = $(SRC_DIR)/code
OUT = example
TEST_DIR = t

test:
make -C $(TEST_DIR)

test_clean:
make -C $(TEST_DIR) clean

code.o:
gcc -c -I$(CODE_DIR) $(CODE_DIR)/code.cpp -o $(CODE_DIR)/code.o

main: code.o
gcc -I$(CODE_DIR) $(CODE_DIR)/code.o $(SRC_DIR)/main.cpp -o $(OUT)

all: test main

clean: test_clean
rm $(SRC_DIR)/*.o $(CODE_DIR)/*.o $(OUT)

لاحظ أن هذا يستخدم ‘make -C’  لأهداف الاختبار – مما يعني أنه سيقوم بالاتصال بـ ‘make’  مرة أخرى باستخدام ملف Makefile في دليل الاختبار.

في هذه النقطة يمكننا تجميع كود ‘src’ باستخدام ملف Makefile ورؤية أنه يعمل:

[]$ make main
gcc -c -I./src/code ./src/code/code.cpp -o ./src/code/code.o
gcc -I./src/code ./src/code/code.o ./src/main.cpp -o example
[]$ ./example
hello world

سيكون ملف Makefile الخاص بالمشروع على نفس المستوى مثل دلائل ‘src’ و ‘t’ في جذر المشروع. يجب أن يبدو هكذا:

# Makefile

SRC_DIR = ./src
CODE_DIR = $(SRC_DIR)/code
OUT = example
TEST_DIR = t

test:
make -C $(TEST_DIR)

test_clean:
make -C $(TEST_DIR) clean

code.o:
gcc -c -I$(CODE_DIR) $(CODE_DIR)/code.cpp -o $(CODE_DIR)/code.o

main: code.o
gcc -I$(CODE_DIR) $(CODE_DIR)/code.o $(SRC_DIR)/main.cpp -o $(OUT)

all: test main

clean: test_clean
rm $(SRC_DIR)/*.o $(CODE_DIR)/*.o $(OUT)

لاحظ أن هذا يستخدم ‘make -C’  لأهداف الاختبار – مما يعني أنه سيقوم بالاتصال بـ ‘make’  مرة أخرى باستخدام ملف Makefile في دليل الاختبار.

في هذه النقطة يمكننا تجميع كود ‘src’ باستخدام ملف Makefile ورؤية أنه يعمل:

[]$ make main
gcc -c -I./src/code ./src/code/code.cpp -o ./src/code/code.o
gcc -I./src/code ./src/code/code.o ./src/main.cpp -o example
[]$ ./example
hello world

سيكون ملف Makefile الخاص بالمشروع على نفس المستوى مثل دلائل ‘src’ و ‘t’ في جذر المشروع. يجب أن يبدو هكذا:

# Makefile

SRC_DIR = ./src
CODE_DIR = $(SRC_DIR)/code
OUT = example
TEST_DIR = t

test:
make -C $(TEST_DIR)

test_clean:
make -C $(TEST_DIR) clean

code.o:
gcc -c -I$(CODE_DIR) $(CODE_DIR)/code.cpp -o $(CODE_DIR)/code.o

main: code.o
gcc -I$(CODE_DIR) $(CODE_DIR)/code.o $(SRC_DIR)/main.cpp -o $(OUT)

all: test main

clean: test_clean
rm $(SRC_DIR)/*.o $(CODE_DIR)/*.o $(OUT)

لاحظ أن هذا يستخدم ‘make -C’  لأهداف الاختبار – مما يعني أنه سيقوم بالاتصال بـ ‘make’  مرة أخرى باستخدام ملف Makefile في دليل الاختبار.

في هذه النقطة يمكننا تجميع كود ‘src’ باستخدام ملف Makefile ورؤية أنه يعمل:

[]$ make main
gcc -c -I./src/code ./src/code/code.cpp -o ./src/code/code.o
gcc -I./src/code ./src/code/code.o ./src/main.cpp -o example
[]$ ./example
hello world

اختبارات ملف التكوين

بالنسبة للاختبارات، الأمور أكثر تعقيدًا قليلاً لأننا بحاجة إلى تحميل ودمج مكتبة CppUTest بشكل صحيح.

يوفر مستودع CppUTest ملفًا يسمى “MakefileWorker.mk”. يوفر العديد من الوظائف التي تجعل عملية البناء باستخدام CppUTest بسيطة. يعيش الملف تحت دليل “build” في مستودع git. في هذا البرنامج التعليمي، سنفترض أنه تم نسخه إلى دليل ‘t/’. يمكن استخدامه على النحو التالي:

# we don’t want to use relative paths, so we set these variables
PROJECT_DIR=/path/to/project
SRC_DIR=$(PROJECT_DIR)/src
TEST_DIR=$(PROJECT_DIR)/t

# specify where the source code and includes are located
INCLUDE_DIRS=$(SRC_DIR)/code
SRC_DIRS=$(SRC_DIR)/code

# specify where the test code is located
TEST_SRC_DIRS=$(TEST_DIR)

# what to call the test binary
TEST_TARGET=example

# where the cpputest library is located
CPPUTEST_HOME=/usr/local

# run MakefileWorker.mk with the variables defined here
include MakefileWorker.mk

لاحظ أن CPPUTEST_HOME يجب أن يُحدد في المكان الذي تم تثبيت CppUTest فيه. إذا قمت بتثبيت حزمة توزيعة، فسيكون هذا عادةً تحت /usr/local على نظام لينيكس/ماك. إذا كنت قد قمت بسحب المستودع بنفسك، فإنه يوجد في أي مكان يكون فيه ذلك السحب.

تم توثيق هذه الخيارات جميعًا في MakefileWorker.mk.

كما يضيف MakefileWorker.mk بضع أهداف Makefile، بما في ذلك ما يلي:

  1. all – يبني الاختبارات المحددة بواسطة Makefile

  2. clean – يزيل جميع ملفات الكائن و gcov التي تم إنشاؤها للاختبارات

  3. realclean – يزيل أي ملفات كائن أو gcov في شجرة الدليل بالكامل

  4. flags – يسرد جميع العلامات المكونة المستخدمة لتجميع الاختبارات

  5. debug – يسرد جميع ملفات المصدر، والأشياء، والاعتمادات، و“الأشياء التي يجب تنظيفها”


المكون

الغرض

الملفات الرئيسية / العلامات

ملاحظات

Makefile المشروع

يبني كود المصدر الأساسي

Makefile على مستوى الجذر باستخدام make -C

يجمع src/ ويفوض الاختبارات إلى t/

Makefile الاختبارات

يبني ويربط الاختبارات مع CppUTest

t/Makefile التي تشير إلى MakefileWorker.mk

يتعامل مع تجميع الاختبار والربط وعلامات المكتبة

MakefileWorker.mk

يوفر منطق بناء قابلاً لإعادة الاستخدام

يقع في دليل CppUTest /build

يضيف أهداف: all، clean، realclean، flags، debug

التكامل مع GCov

يمكن من إعداد تقارير تغطية الشفرة

CPPUTEST_USE_GCOV=Y

ينتج .gcov، تقارير HTML

الكشف عن تسريبات الذاكرة

يكتشف تسريبات malloc/free

CPPUTEST_USE_MEM_LEAK_DETECTION

مفعل بشكل افتراضي؛ يمكن تعطيله بواسطة =N

عداء الاختبار

ينفذ مجموعات الاختبار

CommandLineTestRunner

نقطة الدخول الرئيسية المطلوبة لتنفيذ الاختبارات

بالنسبة للاختبارات، الأمور أكثر تعقيدًا قليلاً لأننا بحاجة إلى تحميل ودمج مكتبة CppUTest بشكل صحيح.

يوفر مستودع CppUTest ملفًا يسمى “MakefileWorker.mk”. يوفر العديد من الوظائف التي تجعل عملية البناء باستخدام CppUTest بسيطة. يعيش الملف تحت دليل “build” في مستودع git. في هذا البرنامج التعليمي، سنفترض أنه تم نسخه إلى دليل ‘t/’. يمكن استخدامه على النحو التالي:

# we don’t want to use relative paths, so we set these variables
PROJECT_DIR=/path/to/project
SRC_DIR=$(PROJECT_DIR)/src
TEST_DIR=$(PROJECT_DIR)/t

# specify where the source code and includes are located
INCLUDE_DIRS=$(SRC_DIR)/code
SRC_DIRS=$(SRC_DIR)/code

# specify where the test code is located
TEST_SRC_DIRS=$(TEST_DIR)

# what to call the test binary
TEST_TARGET=example

# where the cpputest library is located
CPPUTEST_HOME=/usr/local

# run MakefileWorker.mk with the variables defined here
include MakefileWorker.mk

لاحظ أن CPPUTEST_HOME يجب أن يُحدد في المكان الذي تم تثبيت CppUTest فيه. إذا قمت بتثبيت حزمة توزيعة، فسيكون هذا عادةً تحت /usr/local على نظام لينيكس/ماك. إذا كنت قد قمت بسحب المستودع بنفسك، فإنه يوجد في أي مكان يكون فيه ذلك السحب.

تم توثيق هذه الخيارات جميعًا في MakefileWorker.mk.

كما يضيف MakefileWorker.mk بضع أهداف Makefile، بما في ذلك ما يلي:

  1. all – يبني الاختبارات المحددة بواسطة Makefile

  2. clean – يزيل جميع ملفات الكائن و gcov التي تم إنشاؤها للاختبارات

  3. realclean – يزيل أي ملفات كائن أو gcov في شجرة الدليل بالكامل

  4. flags – يسرد جميع العلامات المكونة المستخدمة لتجميع الاختبارات

  5. debug – يسرد جميع ملفات المصدر، والأشياء، والاعتمادات، و“الأشياء التي يجب تنظيفها”


المكون

الغرض

الملفات الرئيسية / العلامات

ملاحظات

Makefile المشروع

يبني كود المصدر الأساسي

Makefile على مستوى الجذر باستخدام make -C

يجمع src/ ويفوض الاختبارات إلى t/

Makefile الاختبارات

يبني ويربط الاختبارات مع CppUTest

t/Makefile التي تشير إلى MakefileWorker.mk

يتعامل مع تجميع الاختبار والربط وعلامات المكتبة

MakefileWorker.mk

يوفر منطق بناء قابلاً لإعادة الاستخدام

يقع في دليل CppUTest /build

يضيف أهداف: all، clean، realclean، flags، debug

التكامل مع GCov

يمكن من إعداد تقارير تغطية الشفرة

CPPUTEST_USE_GCOV=Y

ينتج .gcov، تقارير HTML

الكشف عن تسريبات الذاكرة

يكتشف تسريبات malloc/free

CPPUTEST_USE_MEM_LEAK_DETECTION

مفعل بشكل افتراضي؛ يمكن تعطيله بواسطة =N

عداء الاختبار

ينفذ مجموعات الاختبار

CommandLineTestRunner

نقطة الدخول الرئيسية المطلوبة لتنفيذ الاختبارات

بالنسبة للاختبارات، الأمور أكثر تعقيدًا قليلاً لأننا بحاجة إلى تحميل ودمج مكتبة CppUTest بشكل صحيح.

يوفر مستودع CppUTest ملفًا يسمى “MakefileWorker.mk”. يوفر العديد من الوظائف التي تجعل عملية البناء باستخدام CppUTest بسيطة. يعيش الملف تحت دليل “build” في مستودع git. في هذا البرنامج التعليمي، سنفترض أنه تم نسخه إلى دليل ‘t/’. يمكن استخدامه على النحو التالي:

# we don’t want to use relative paths, so we set these variables
PROJECT_DIR=/path/to/project
SRC_DIR=$(PROJECT_DIR)/src
TEST_DIR=$(PROJECT_DIR)/t

# specify where the source code and includes are located
INCLUDE_DIRS=$(SRC_DIR)/code
SRC_DIRS=$(SRC_DIR)/code

# specify where the test code is located
TEST_SRC_DIRS=$(TEST_DIR)

# what to call the test binary
TEST_TARGET=example

# where the cpputest library is located
CPPUTEST_HOME=/usr/local

# run MakefileWorker.mk with the variables defined here
include MakefileWorker.mk

لاحظ أن CPPUTEST_HOME يجب أن يُحدد في المكان الذي تم تثبيت CppUTest فيه. إذا قمت بتثبيت حزمة توزيعة، فسيكون هذا عادةً تحت /usr/local على نظام لينيكس/ماك. إذا كنت قد قمت بسحب المستودع بنفسك، فإنه يوجد في أي مكان يكون فيه ذلك السحب.

تم توثيق هذه الخيارات جميعًا في MakefileWorker.mk.

كما يضيف MakefileWorker.mk بضع أهداف Makefile، بما في ذلك ما يلي:

  1. all – يبني الاختبارات المحددة بواسطة Makefile

  2. clean – يزيل جميع ملفات الكائن و gcov التي تم إنشاؤها للاختبارات

  3. realclean – يزيل أي ملفات كائن أو gcov في شجرة الدليل بالكامل

  4. flags – يسرد جميع العلامات المكونة المستخدمة لتجميع الاختبارات

  5. debug – يسرد جميع ملفات المصدر، والأشياء، والاعتمادات، و“الأشياء التي يجب تنظيفها”


المكون

الغرض

الملفات الرئيسية / العلامات

ملاحظات

Makefile المشروع

يبني كود المصدر الأساسي

Makefile على مستوى الجذر باستخدام make -C

يجمع src/ ويفوض الاختبارات إلى t/

Makefile الاختبارات

يبني ويربط الاختبارات مع CppUTest

t/Makefile التي تشير إلى MakefileWorker.mk

يتعامل مع تجميع الاختبار والربط وعلامات المكتبة

MakefileWorker.mk

يوفر منطق بناء قابلاً لإعادة الاستخدام

يقع في دليل CppUTest /build

يضيف أهداف: all، clean، realclean، flags، debug

التكامل مع GCov

يمكن من إعداد تقارير تغطية الشفرة

CPPUTEST_USE_GCOV=Y

ينتج .gcov، تقارير HTML

الكشف عن تسريبات الذاكرة

يكتشف تسريبات malloc/free

CPPUTEST_USE_MEM_LEAK_DETECTION

مفعل بشكل افتراضي؛ يمكن تعطيله بواسطة =N

عداء الاختبار

ينفذ مجموعات الاختبار

CommandLineTestRunner

نقطة الدخول الرئيسية المطلوبة لتنفيذ الاختبارات

تغطية الكود

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

CPPUTEST_USE_GCOV=Y

بعد ذلك، نحتاج إلى التأكد من أن نص المرشح filterGcov.sh من هذا المستودع موجود في ‘/scripts/filterGcov.sh’ بالنسبة إلى أي مكان قمت بتعيين ‘CPPUTEST_HOME’ ليكون. كما يحتاج إلى أذونات تنفيذ.

في مثال Makefile، سيتم نشره إلى ‘/usr/local/scripts/filterGcov.sh’. إذا كنت تقوم بتشغيل CppUTest من سحب المستودع، يجب أن يعمل كل شيء بدون تعديل.

مع ذلك في مكانه، يمكنك ببساطة تشغيل ‘make gcov’ وسيتم إنشاء التحليل لك. في حالتنا، سنحتاج إلى ‘make -B’ لإعادة بناء ملفات الكائن مع تمكين gcov:

[]$ make -B gcov
< compilation output >

for d in /Users/ykuperman/code/blogpost/qa/src/code ; do \
    FILES=`ls $d/*.c $d/*.cc $d/*.cpp 2> /dev/null` ; \
    gcov --object-directory objs/$d $FILES >> gcov_output.txt 2>>gcov_error.txt ; \
done

for f in  ; do \
    gcov --object-directory objs/$f $f >> gcov_output.txt 2>>gcov_error.txt ; \
done

/usr/local/scripts/filterGcov.sh gcov_output.txt gcov_error.txt gcov_report.txt example.txt

cat gcov_report.txt
100.00% /Users/ykuperman/code/blogpost/qa/src/code/code.cpp

mkdir -p gcov
mv *.gcov gcov
mv gcov_* gcov

See gcov directory for details

سيؤدي هذا إلى إخراج عدد من الملفات إلى مجلد جديد يسمى ‘gcov’. وهذه هي:

  1. code.cpp.gcov – ملف ‘gcov’ الفعلي للشيفرة التي يتم اختبارها

  2. gcov_error.txt – تقرير خطأ (في حالتنا، ينبغي أن يكون فارغًا)

  3. gcov_output.txt – الإخراج الفعلي لأمر gcov الذي تم تشغيله

  4. gcov_report.txt – ملخص عن التغطية لكل ملف قيد الاختبار

  5. gcov_report.txt.html – نسخة html من gcov_report

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

CPPUTEST_USE_GCOV=Y

بعد ذلك، نحتاج إلى التأكد من أن نص المرشح filterGcov.sh من هذا المستودع موجود في ‘/scripts/filterGcov.sh’ بالنسبة إلى أي مكان قمت بتعيين ‘CPPUTEST_HOME’ ليكون. كما يحتاج إلى أذونات تنفيذ.

في مثال Makefile، سيتم نشره إلى ‘/usr/local/scripts/filterGcov.sh’. إذا كنت تقوم بتشغيل CppUTest من سحب المستودع، يجب أن يعمل كل شيء بدون تعديل.

مع ذلك في مكانه، يمكنك ببساطة تشغيل ‘make gcov’ وسيتم إنشاء التحليل لك. في حالتنا، سنحتاج إلى ‘make -B’ لإعادة بناء ملفات الكائن مع تمكين gcov:

[]$ make -B gcov
< compilation output >

for d in /Users/ykuperman/code/blogpost/qa/src/code ; do \
    FILES=`ls $d/*.c $d/*.cc $d/*.cpp 2> /dev/null` ; \
    gcov --object-directory objs/$d $FILES >> gcov_output.txt 2>>gcov_error.txt ; \
done

for f in  ; do \
    gcov --object-directory objs/$f $f >> gcov_output.txt 2>>gcov_error.txt ; \
done

/usr/local/scripts/filterGcov.sh gcov_output.txt gcov_error.txt gcov_report.txt example.txt

cat gcov_report.txt
100.00% /Users/ykuperman/code/blogpost/qa/src/code/code.cpp

mkdir -p gcov
mv *.gcov gcov
mv gcov_* gcov

See gcov directory for details

سيؤدي هذا إلى إخراج عدد من الملفات إلى مجلد جديد يسمى ‘gcov’. وهذه هي:

  1. code.cpp.gcov – ملف ‘gcov’ الفعلي للشيفرة التي يتم اختبارها

  2. gcov_error.txt – تقرير خطأ (في حالتنا، ينبغي أن يكون فارغًا)

  3. gcov_output.txt – الإخراج الفعلي لأمر gcov الذي تم تشغيله

  4. gcov_report.txt – ملخص عن التغطية لكل ملف قيد الاختبار

  5. gcov_report.txt.html – نسخة html من gcov_report

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

CPPUTEST_USE_GCOV=Y

بعد ذلك، نحتاج إلى التأكد من أن نص المرشح filterGcov.sh من هذا المستودع موجود في ‘/scripts/filterGcov.sh’ بالنسبة إلى أي مكان قمت بتعيين ‘CPPUTEST_HOME’ ليكون. كما يحتاج إلى أذونات تنفيذ.

في مثال Makefile، سيتم نشره إلى ‘/usr/local/scripts/filterGcov.sh’. إذا كنت تقوم بتشغيل CppUTest من سحب المستودع، يجب أن يعمل كل شيء بدون تعديل.

مع ذلك في مكانه، يمكنك ببساطة تشغيل ‘make gcov’ وسيتم إنشاء التحليل لك. في حالتنا، سنحتاج إلى ‘make -B’ لإعادة بناء ملفات الكائن مع تمكين gcov:

[]$ make -B gcov
< compilation output >

for d in /Users/ykuperman/code/blogpost/qa/src/code ; do \
    FILES=`ls $d/*.c $d/*.cc $d/*.cpp 2> /dev/null` ; \
    gcov --object-directory objs/$d $FILES >> gcov_output.txt 2>>gcov_error.txt ; \
done

for f in  ; do \
    gcov --object-directory objs/$f $f >> gcov_output.txt 2>>gcov_error.txt ; \
done

/usr/local/scripts/filterGcov.sh gcov_output.txt gcov_error.txt gcov_report.txt example.txt

cat gcov_report.txt
100.00% /Users/ykuperman/code/blogpost/qa/src/code/code.cpp

mkdir -p gcov
mv *.gcov gcov
mv gcov_* gcov

See gcov directory for details

سيؤدي هذا إلى إخراج عدد من الملفات إلى مجلد جديد يسمى ‘gcov’. وهذه هي:

  1. code.cpp.gcov – ملف ‘gcov’ الفعلي للشيفرة التي يتم اختبارها

  2. gcov_error.txt – تقرير خطأ (في حالتنا، ينبغي أن يكون فارغًا)

  3. gcov_output.txt – الإخراج الفعلي لأمر gcov الذي تم تشغيله

  4. gcov_report.txt – ملخص عن التغطية لكل ملف قيد الاختبار

  5. gcov_report.txt.html – نسخة html من gcov_report

كشف تسرب الذاكرة في Cpputest

Cpputest يتيح لك اكتشاف ذاكرة مسربة تلقائيًا عن طريق إعادة تعريف عائلة الدوال القياسية "malloc/free" لاستخدام أغلفته الخاصة بدلاً من ذلك. وهذا يسمح له بالكشف عن التسريبات بسرعة والإبلاغ عنها لكل تنفيذ اختبار. هذه الميزة مفعلة افتراضيًا في MakefileWorker.mk، لذا فهي مفعلّة بالفعل مع الخطوات المذكورة حتى الآن.

لتوضيح ذلك، دعنا نتسبب في تسرب بعض الذاكرة في test_func() !

عند العودة إلى code.c، نضيف malloc()  إلى الدالة، كما يلي:

int test_func() {
    malloc(1);
    return 1;
}

الآن، بعد إعادة التجميع، يتم إنتاج الخطأ التالي:

test.cpp:9: error: Failure in TEST(AwesomeExamples, FirstExample)
Memory leak(s) found.
Alloc num (4)
Leak size: 1
Allocated at: ./code.c and line: 6
Type: "malloc"
Memory: <

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

هناك بعض التحذيرات بشأن هذه الميزة:

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

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

CPPUTEST_USE_MEM_LEAK_DETECTION=N

Cpputest يتيح لك اكتشاف ذاكرة مسربة تلقائيًا عن طريق إعادة تعريف عائلة الدوال القياسية "malloc/free" لاستخدام أغلفته الخاصة بدلاً من ذلك. وهذا يسمح له بالكشف عن التسريبات بسرعة والإبلاغ عنها لكل تنفيذ اختبار. هذه الميزة مفعلة افتراضيًا في MakefileWorker.mk، لذا فهي مفعلّة بالفعل مع الخطوات المذكورة حتى الآن.

لتوضيح ذلك، دعنا نتسبب في تسرب بعض الذاكرة في test_func() !

عند العودة إلى code.c، نضيف malloc()  إلى الدالة، كما يلي:

int test_func() {
    malloc(1);
    return 1;
}

الآن، بعد إعادة التجميع، يتم إنتاج الخطأ التالي:

test.cpp:9: error: Failure in TEST(AwesomeExamples, FirstExample)
Memory leak(s) found.
Alloc num (4)
Leak size: 1
Allocated at: ./code.c and line: 6
Type: "malloc"
Memory: <

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

هناك بعض التحذيرات بشأن هذه الميزة:

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

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

CPPUTEST_USE_MEM_LEAK_DETECTION=N

Cpputest يتيح لك اكتشاف ذاكرة مسربة تلقائيًا عن طريق إعادة تعريف عائلة الدوال القياسية "malloc/free" لاستخدام أغلفته الخاصة بدلاً من ذلك. وهذا يسمح له بالكشف عن التسريبات بسرعة والإبلاغ عنها لكل تنفيذ اختبار. هذه الميزة مفعلة افتراضيًا في MakefileWorker.mk، لذا فهي مفعلّة بالفعل مع الخطوات المذكورة حتى الآن.

لتوضيح ذلك، دعنا نتسبب في تسرب بعض الذاكرة في test_func() !

عند العودة إلى code.c، نضيف malloc()  إلى الدالة، كما يلي:

int test_func() {
    malloc(1);
    return 1;
}

الآن، بعد إعادة التجميع، يتم إنتاج الخطأ التالي:

test.cpp:9: error: Failure in TEST(AwesomeExamples, FirstExample)
Memory leak(s) found.
Alloc num (4)
Leak size: 1
Allocated at: ./code.c and line: 6
Type: "malloc"
Memory: <

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

هناك بعض التحذيرات بشأن هذه الميزة:

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

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

CPPUTEST_USE_MEM_LEAK_DETECTION=N

أخبار أخرى

اقرأ المزيد من هذه الفئة

A person is standing at a desk while typing on a laptop.

المنصة الكاملة المدعومة بالذكاء الاصطناعي التي تتوسع مع أعمالك.

A person is standing at a desk while typing on a laptop.

المنصة الكاملة المدعومة بالذكاء الاصطناعي التي تتوسع مع أعمالك.

A person is standing at a desk while typing on a laptop.

المنصة الكاملة المدعومة بالذكاء الاصطناعي التي تتوسع مع أعمالك.