c - यूनिट परीक्षण सी कोड



unit-testing testing (20)

Google में उत्कृष्ट परीक्षण ढांचा है। http://code.google.com/p/googletest/wiki/GoogleTestPrimer

और हाँ, जहां तक ​​मुझे लगता है कि यह सादा सी के साथ काम करेगा, यानी सी ++ सुविधाओं की आवश्यकता नहीं है (सी ++ कंपाइलर की आवश्यकता हो सकती है, सुनिश्चित नहीं है)।

https://code.i-harness.com

मैंने इस गर्मी को सीधे सी में लिखे एक एम्बेडेड सिस्टम पर काम किया। यह एक मौजूदा प्रोजेक्ट था जिसे मैंने काम करने वाली कंपनी को संभाला था। मैं जुनीट का उपयोग कर जावा में यूनिट परीक्षण लिखने के लिए बहुत आदी हो गया हूं लेकिन मौजूदा कोड (जिसे रिफैक्टरिंग की आवश्यकता है) के साथ यूनिट परीक्षणों के साथ-साथ सिस्टम में जोड़े गए नए कोड के लिए यूनिट परीक्षण लिखने का सबसे अच्छा तरीका है।

यूनिट परीक्षण सादे सी कोड को इकाई परीक्षण जावा कोड के रूप में आसान बनाने के लिए कोई तरीका है, उदाहरण के लिए, जुनीट ? कोई भी अंतर्दृष्टि जो विशेष रूप से एम्बेडेड विकास (आर्म-लिनक्स प्लेटफॉर्म पर क्रॉस-कंपाइलिंग) पर लागू होगी, की सराहना की जाएगी।


आप भी libtap , एक सी परीक्षण ढांचे पर एक नज़र libtap चाहते हैं जो टेस्ट कुछ भी प्रोटोकॉल (टीएपी) आउटपुट करता है और इस प्रकार इस तकनीक के लिए विभिन्न प्रकार के टूल्स के साथ अच्छी तरह से एकीकृत करता है। यह ज्यादातर गतिशील भाषा दुनिया में उपयोग किया जाता है, लेकिन इसका उपयोग करना और बहुत लोकप्रिय होना आसान है।

एक उदाहरण:

#include <tap.h>

int main () {
    plan(5);

    ok(3 == 3);
    is("fnord", "eek", "two different strings not that way?");
    ok(3 <= 8732, "%d <= %d", 3, 8732);
    like("fnord", "f(yes|no)r*[a-f]$");
    cmp_ok(3, ">=", 10);

    done_testing();
}

उपयोग करने के लिए एक तकनीक सी ++ xUnit फ्रेमवर्क (और सी ++ कंपाइलर) के साथ यूनिट टेस्ट कोड विकसित करना है, जबकि सी मॉड्यूल के रूप में लक्ष्य प्रणाली के स्रोत को बनाए रखना है।

सुनिश्चित करें कि यदि आप संभव हो तो अपने यूनिट परीक्षणों के साथ स्वचालित रूप से अपने क्रॉस-कंपाइलर के तहत अपने सी स्रोत को संकलित करें।


एक सी नौसिखिया के रूप में, मुझे सी में टेस्ट संचालित विकास नामक स्लाइड्स मिलीं जो बहुत उपयोगी थीं । असल में, यह बिना किसी बाह्य निर्भरता के संदेश भेजने के लिए मानक assert() के साथ && का उपयोग करता है। अगर किसी को पूर्ण स्टैक परीक्षण ढांचे में उपयोग किया जाता है, तो यह संभवतः नहीं करेगा :)


मिनूनिट पढ़ने के बाद मैंने सोचा कि बेहतर तरीका मैक्रो पर जोर देने के लिए परीक्षण था जिसे मैं रक्षात्मक प्रोग्राम तकनीक की तरह बहुत उपयोग करता हूं। तो मैंने मानक assert के साथ मिश्रित Minunit के एक ही विचार का इस्तेमाल किया। आप k0ga के ब्लॉग में अपना ढांचा (एक अच्छा नाम NoMinunit हो सकता है) देख सकते हैं


मुझे आश्चर्य है कि कोई भी कटर का उल्लेख नहीं करता है (http://cutter.sourceforge.net/) आप सी और सी ++ का परीक्षण कर सकते हैं, यह सहजता से ऑटोोटूल के साथ एकीकृत करता है और इसमें वास्तव में एक अच्छा ट्यूटोरियल उपलब्ध है।


मैं एक एम्बेडेड सी / सी ++ पर्यावरण (मुख्य रूप से सी ++) के लिए CxxTest उपयोग करता CxxTest

मैं CxxTest पसंद करता हूं क्योंकि इसमें परीक्षण धावक बनाने के लिए एक पर्ल / पायथन स्क्रिप्ट है। इसे सेटअप करने के लिए एक छोटी ढलान के बाद (अभी भी छोटा है क्योंकि आपको टेस्ट रनर लिखना नहीं है), यह उपयोग करना बहुत आसान है (नमूने और उपयोगी दस्तावेज शामिल हैं)। सबसे अधिक काम 'हार्डवेयर' को कोड एक्सेस करने की स्थापना कर रहा था, इसलिए मैं इकाई / मॉड्यूल परीक्षण प्रभावी ढंग से कर सकता था। इसके बाद नए यूनिट परीक्षण मामलों को जोड़ना आसान है।

जैसा कि पहले उल्लेख किया गया है यह एक सी / सी ++ इकाई परीक्षण ढांचा है। तो आपको एक सी ++ कंपाइलर की आवश्यकता होगी।

CxxTest उपयोगकर्ता गाइड CxxTest विकी


मैं एक ढांचे का उपयोग नहीं करता, मैं सिर्फ autotools "चेक" लक्ष्य समर्थन का उपयोग करता हूं। एक "मुख्य" लागू करें और assert (ओं) का उपयोग करें।

मेरा परीक्षण डीआईआर Makefile.am (ओं) इस तरह दिखते हैं:

check_PROGRAMS = test_oe_amqp

test_oe_amqp_SOURCES = test_oe_amqp.c
test_oe_amqp_LDADD = -L$(top_builddir)/components/common -loecommon
test_oe_amqp_CFLAGS = -I$(top_srcdir)/components/common -static

TESTS = test_oe_amqp

मैं वर्तमान में क्यूटेस्ट इकाई परीक्षण ढांचे का उपयोग कर रहा हूं:

http://cutest.sourceforge.net/

यह एम्बेडेड सिस्टम के लिए आदर्श है क्योंकि यह बहुत हल्का और सरल है। मुझे लक्षित प्लेटफार्म के साथ-साथ डेस्कटॉप पर काम करने में कोई समस्या नहीं थी। इकाई परीक्षण लिखने के अलावा, यह आवश्यक है:

  • जहां भी आप क्यूटेस्ट रूटीन को कॉल कर रहे हैं वहां हेडर फ़ाइल शामिल है
  • छवि में संकलित / लिंक करने के लिए एक अतिरिक्त 'सी' फ़ाइल
  • इकाई परीक्षणों को स्थापित करने और कॉल करने के लिए मुख्य में कुछ सरल कोड जोड़ा गया - मेरे पास यह एक विशेष मुख्य () फ़ंक्शन में है जो कि निर्माण के दौरान UNITTEST को परिभाषित किया गया है।

सिस्टम को एक ढेर और कुछ stdio कार्यक्षमता का समर्थन करने की आवश्यकता है (जो सभी एम्बेडेड सिस्टम नहीं है)। लेकिन कोड इतना आसान है कि यदि संभवतः आपके प्लेटफ़ॉर्म में नहीं है तो आप उन आवश्यकताओं के विकल्पों में काम कर सकते हैं।

बाहरी "सी" {} ब्लॉक के कुछ न्यायिक उपयोग के साथ यह परीक्षण C ++ को ठीक से समर्थन देता है।


मैंने लक्ष्य पर परीक्षण से पहले पीसी पर एम्बेडेड कोड के लिए कुछ यूनिट परीक्षण करने के लिए RCUNIT का इस्तेमाल किया। अच्छा हार्डवेयर इंटरफ़ेस अबास्ट्रक्शन महत्वपूर्ण है और अंतहीनता और मेमोरी मैप किए गए रजिस्ट्रार आपको मारने जा रहे हैं।


यदि आप अभी भी परीक्षण ढांचे के लिए शिकार पर हैं, तो CUnitWin32 Win32 / NT प्लेटफ़ॉर्म के लिए एक है।

यह एक मौलिक समस्या हल करता है जिसे मैंने अन्य परीक्षण ढांचे के साथ सामना किया। अर्थात् वैश्विक / स्थिर चर एक निर्धारक स्थिति में हैं क्योंकि प्रत्येक परीक्षण को एक अलग प्रक्रिया के रूप में निष्पादित किया जाता है।


यदि आप जुनीट से परिचित हैं तो मैं CppUnit की अनुशंसा करता हूं। http://cppunit.sourceforge.net/cppunit-wiki

ऐसा माना जाता है कि यूनिट परीक्षण करने के लिए आपके पास c ++ कंपाइलर है। यदि नहीं तो मुझे एडम रोसेनफील्ड से सहमत होना है कि आप जो चाहते हैं वह जांच करें।



व्यक्तिगत रूप से मुझे Google टेस्ट फ्रेमवर्क पसंद है

सी कोड का परीक्षण करने में वास्तविक कठिनाई बाहरी मॉड्यूल पर निर्भरता तोड़ रही है ताकि आप इकाइयों में कोड अलग कर सकें। जब आप विरासत कोड के आसपास परीक्षण प्राप्त करने का प्रयास कर रहे हैं तो यह विशेष रूप से समस्याग्रस्त हो सकता है। इस मामले में मैं अक्सर परीक्षण में स्टब्स कार्यों का उपयोग करने के लिए लिंकर का उपयोग करके खुद को ढूंढता हूं।

जब लोग " सीम " के बारे में बात करते हैं तो लोग यही जिक्र कर रहे हैं। सी में आपका एकमात्र विकल्प वास्तव में प्री-प्रोसेसर या लिंकर का उपयोग अपनी निर्भरताओं को नकल करने के लिए करना है।

मेरी सी परियोजनाओं में से एक में एक सामान्य परीक्षण सूट इस तरह दिख सकता है:

#include "myimplementationfile.c"
#include <gtest/gtest.h>

// Mock out external dependency on mylogger.o
void Logger_log(...){}

TEST(FactorialTest, Zero) {
    EXPECT_EQ(1, Factorial(0));
}

ध्यान दें कि आप वास्तव में सी फ़ाइल सहित हैं और हेडर फ़ाइल नहीं । यह सभी स्थिर डेटा सदस्यों तक पहुंच का लाभ देता है। यहां मैं अपने लॉगर का मज़ाक उड़ाता हूं (जो logger.o में हो सकता है और एक खाली कार्यान्वयन दे सकता है। इसका मतलब है कि परीक्षण फ़ाइल शेष कोड बेस से स्वतंत्र रूप से संकलित और लिंक करती है और अलगाव में निष्पादित होती है।

कोड को पार करने के लिए, इस काम के लिए आपको लक्ष्य पर अच्छी सुविधाएं चाहिए। मैंने इसे PowerPC आर्किटेक्चर पर लिनक्स में संकलित googletest क्रॉस के साथ किया है। यह समझ में आता है क्योंकि आपके परिणामों को इकट्ठा करने के लिए आपके पास एक पूर्ण खोल और ओएस है। कम समृद्ध वातावरण के लिए (जिसे मैं पूर्ण ओएस के बिना कुछ भी वर्गीकृत करता हूं) आपको बस मेजबान बनाना और चलाने चाहिए। आपको वैसे भी ऐसा करना चाहिए ताकि आप निर्माण के हिस्से के रूप में स्वचालित रूप से परीक्षण चला सकें।

मुझे लगता है कि परीक्षण सी ++ कोड आमतौर पर इस तथ्य के कारण बहुत आसान होता है कि ओओ कोड सामान्य रूप से प्रक्रियात्मक से कम युग्मित होता है (बेशक यह कोडिंग शैली पर बहुत निर्भर करता है)। सी ++ में आप निर्भरता इंजेक्शन और विधि को ओवरराइड करने के तरीके को ओवरराइड करने वाले कोड में सीम प्राप्त करने के लिए ओवरराइडिंग का उपयोग कर सकते हैं।

माइकल फेदरस की विरासत कोड का परीक्षण करने के बारे में एक उत्कृष्ट पुस्तक है । एक अध्याय में वह गैर-ओओ कोड से निपटने के लिए तकनीकों को शामिल करता है जिसे मैं अत्यधिक अनुशंसा करता हूं।

संपादित करें : मैंने गिटहब पर उपलब्ध स्रोत के साथ इकाई परीक्षण प्रक्रियात्मक कोड के बारे में एक ब्लॉग पोस्ट लिखा है

संपादित करें : व्यावहारिक प्रोग्रामर से एक नई पुस्तक आ रही है जो विशेष रूप से यूनिट परीक्षण सी कोड को संबोधित करती है जिसे मैं अत्यधिक अनुशंसा करता हूं


सी में एक यूनिट परीक्षण ढांचा Check ; सी में इकाई परीक्षण ढांचे की एक सूची here पाई जा सकती here और नीचे पुन: उत्पन्न की जाती है। आपके रनटाइम के कितने मानक लाइब्रेरी कार्य करते हैं, इस पर निर्भर करते हुए, आप इनमें से किसी एक का उपयोग करने में सक्षम हो सकते हैं या नहीं।

AceUnit

ऐसनीट (एडवांस्ड सी और एंबेडेड यूनिट) खुद को आरामदायक सी कोड यूनिट टेस्ट फ्रेमवर्क के रूप में बिल करता है। यह जुनीट 4.x की नकल करने की कोशिश करता है और प्रतिबिंब जैसी क्षमताओं को शामिल करता है। AceUnit संसाधन बाधा वातावरण में उपयोग किया जा सकता है, उदाहरण के लिए एम्बेडेड सॉफ़्टवेयर विकास, और महत्वपूर्ण रूप से यह उन वातावरणों में ठीक चलता है जहां आप एक मानक शीर्षलेख फ़ाइल शामिल नहीं कर सकते हैं और एएनएसआई / आईएसओ सी पुस्तकालयों से एक मानक सी फ़ंक्शन का आह्वान नहीं कर सकते हैं। इसमें एक विंडोज पोर्ट भी है। यह जाल संकेतों के लिए कांटे का उपयोग नहीं करता है, हालांकि लेखकों ने ऐसी सुविधा जोड़ने में रुचि व्यक्त की है। AceUnit मुखपृष्ठ देखें।

जीएनयू Autounit

चेक के समान ही लाइनों के साथ, एक अलग पता स्थान में यूनिट परीक्षण चलाने के लिए मजबूर करने सहित, वास्तव में, चेक के मूल लेखक ने जीएनयू ऑटोऑनिट से विचार उधार लिया)। जीएनयू ऑटोऑनिट जीएलआईबी का व्यापक रूप से उपयोग करता है, जिसका मतलब है कि लिंकिंग और इस तरह के विशेष विकल्पों की आवश्यकता है, लेकिन यह आपके लिए बड़ी समस्या नहीं हो सकती है, खासकर यदि आप पहले ही जीटीके या जीएलआईबी का उपयोग कर रहे हैं। जीएनयू ऑटोऑनिट होमपेज देखें।

Cunit

जीएलआईबी का भी उपयोग करता है, लेकिन इकाई परीक्षणों के पता स्थान की रक्षा करने के लिए कांटा नहीं है।

Cunit

Win32 GUI कार्यान्वयन के लिए योजनाओं के साथ मानक सी। वर्तमान में फोर्क या अन्यथा यूनिट परीक्षणों की पता स्थान की रक्षा नहीं करता है। शुरुआती विकास में CUnit मुखपृष्ठ देखें।

सबसे प्यारे

केवल एक .c और एक .h फ़ाइल के साथ एक साधारण ढांचा जो आप अपने स्रोत पेड़ में छोड़ते हैं। CuTest मुखपृष्ठ देखें।

CppUnit

सी ++ के लिए प्रमुख इकाई परीक्षण ढांचा; आप सी कोड का परीक्षण करने के लिए इसका भी उपयोग कर सकते हैं। यह स्थिर, सक्रिय रूप से विकसित है, और इसमें एक जीयूआई इंटरफ़ेस है। सी के लिए सीपीपीयूनीट का उपयोग न करने के प्राथमिक कारण पहले हैं कि यह काफी बड़ा है, और दूसरा आपको सी ++ में अपने परीक्षण लिखना है, जिसका अर्थ है कि आपको सी ++ कंपाइलर की आवश्यकता है। यदि ये चिंताओं की तरह नहीं लगते हैं, तो यह अन्य सी ++ इकाई परीक्षण ढांचे के साथ-साथ विचार करने लायक है। CppUnit मुखपृष्ठ देखें।

embUnit

एम्बनीट (एंबेडेड यूनिट) एम्बेडेड सिस्टम के लिए एक और इकाई परीक्षण ढांचा है। ऐसा लगता है कि यह एसेनिट द्वारा अधिग्रहित किया गया है। एम्बेडेड यूनिट होमपेज

MinUnit

मैक्रोज़ का एक न्यूनतम सेट और वह यह है! बिंदु यह दिखाने के लिए है कि इकाई को आपके कोड का परीक्षण करना कितना आसान है। MinUnit मुखपृष्ठ देखें।

श्री एंडो के लिए CUnit

एक CUnit कार्यान्वयन जो काफी नया है, और स्पष्ट रूप से अभी भी शुरुआती विकास में है। श्री एंडो होमपेज के लिए CUnit देखें।

यह सूची मार्च 2008 में अंतिम बार अपडेट की गई थी।

अन्य:

CMocka

सीएमॉकए नकली वस्तुओं के समर्थन के साथ सी के लिए एक परीक्षण ढांचा है। इसका उपयोग करना और सेटअप करना आसान है। cmocka.org आधिकारिक होमपेज।

मापदंड

मानदंड एक क्रॉस-प्लेटफॉर्म सी यूनिट परीक्षण फ्रेमवर्क है जो स्वचालित परीक्षण पंजीकरण, पैरामीटर परीक्षण, सिद्धांतों का समर्थन करता है, और यह टीएपी और जुनीट एक्सएमएल सहित कई प्रारूपों में आउटपुट कर सकता है। प्रत्येक परीक्षण अपनी प्रक्रिया में चलाया जाता है, इसलिए यदि आवश्यक हो तो सिग्नल और क्रैश की सूचना दी जा सकती है या परीक्षण किया जा सकता है। अधिक जानकारी के लिए मानदंड मुखपृष्ठ देखें।

HWUT

एचडब्लूटी सी के लिए बहुत अच्छा समर्थन वाला एक सामान्य यूनिट टेस्ट टूल है। यह मेकफ़ाइल बनाने में मदद कर सकता है, कम से कम 'पुनरावृत्ति तालिकाओं' में कोडित बड़े पैमाने पर परीक्षण केस उत्पन्न कर सकता है, राज्य मशीनों के साथ चल सकता है, सी-स्टब्स उत्पन्न कर सकता है। सामान्य दृष्टिकोण बहुत अनोखा है: वर्डिक्ट्स 'अच्छा स्टडआउट / खराब स्टडआउट' पर आधारित हैं। तुलनात्मक कार्य, हालांकि, लचीला है। इस प्रकार, किसी भी प्रकार की स्क्रिप्ट का उपयोग जांच के लिए किया जा सकता है। यह किसी भी भाषा पर लागू किया जा सकता है जो मानक आउटपुट का उत्पादन कर सकता है। HWUT होमपेज देखें।


हमने आसान उपयोगिता और पोर्टेबिलिटी के लिए CHEAT ( CHEAT पर होस्ट किया) लिखा था।

इसमें कोई निर्भरता नहीं है और इसके लिए कोई स्थापना या कॉन्फ़िगरेशन की आवश्यकता नहीं है। केवल एक हेडर फ़ाइल और एक परीक्षण केस की आवश्यकता है।

#include <cheat.h>

CHEAT_TEST(mathematics_still_work,
    cheat_assert(2 + 2 == 4);
    cheat_assert_not(2 + 2 == 5);
)

टेस्ट एक निष्पादन योग्य में संकलित होते हैं जो परीक्षण चलाने और उनके परिणामों की रिपोर्ट करने का ख्याल रखता है।

$ gcc -I . tests.c
$ ./a.out
..
---
2 successful of 2 run
SUCCESS

इसमें सुंदर रंग भी हैं।


http://code.google.com/p/cmockery/ हाल ही में लॉन्च किया गया Google Code प्रोजेक्ट है जिसमें यूनिट परीक्षण लिखने के लिए सी लाइब्रेरी का उपयोग करना बहुत आसान है।



एपीआई स्वच्छता परीक्षक - सी / सी ++ पुस्तकालयों के लिए परीक्षण ढांचा:

साझा सी / सी ++ लाइब्रेरी के लिए मूल इकाई परीक्षणों का एक स्वचालित जनरेटर। यह पैरामीटर के लिए इनपुट डेटा (ज्यादातर, लेकिन दुर्भाग्य से सभी मामलों में) उत्पन्न करने में सक्षम है और शीर्षलेख में घोषणाओं के विश्लेषण के माध्यम से एपीआई में प्रत्येक समारोह के लिए सरल ("सैनिटी" या "उथला" - गुणवत्ता) परीक्षण मामलों को लिखता है फ़ाइलें।

जेनरेट किए गए परीक्षणों की गुणवत्ता सरल उपयोग मामलों में महत्वपूर्ण त्रुटियों की अनुपस्थिति की जांच करने की अनुमति देती है। उपकरण जेनरेट किए गए परीक्षणों को बनाने और निष्पादित करने में सक्षम है और क्रैश (segfaults), aborts, उत्सर्जित सिग्नल के सभी प्रकार, गैर-शून्य प्रोग्राम रिटर्न कोड और प्रोग्राम फांसी का पता लगाने में सक्षम है।

उदाहरण:


CppUTest - इकाई परीक्षण सी कोड के लिए अत्यधिक अनुशंसित ढांचा।

एम्बेडेड सी के लिए इस थ्रेड टीडीडी में उल्लिखित पुस्तक में दिए गए उदाहरण CppUTest का उपयोग करके लिखे गए हैं।





embedded