यूनिट परीक्षण और सी ++ परियोजनाओं के लिए जेनकिंस के साथ निरंतर एकीकरण

मुझे लगता है कि हर कोई जानता है कि यूनिट परीक्षण क्या हैं, हर कोई जानता है, या कम से कम सुना है कि निरंतर एकीकरण क्या है, और सी ++ में कई कार्यक्रम। लेकिन मुझे इस तथ्य का सामना करना पड़ा कि इंटरनेट पर इस बारे में अधिक जानकारी नहीं है कि यह सब कैसे मिलाएं और इसे एक साथ काम करें। यह आलेख शुरुआती चरण-दर-चरण निर्देश देने का एक प्रयास है जो आपको C ++ परियोजनाओं के लिए इकाई परीक्षण बनाने में पहला कदम उठाने की अनुमति देगा और एक CI सर्वर का उपयोग करके इकाई परीक्षणों की इकाई-दर-इकाई चलाने का आयोजन करेगा।
अद्यतन: योजना:
  1. HelloWorld लिखें
  2. जेनकिंस पर HelloWorld का निर्माण करें
  3. हैलोवर्ल्ड के लिए एक इकाई परीक्षण लिखें
  4. जेनकिन्स पर चलाए जा रहे यूनिट टेस्ट को सेट करें

नोट: कई अक्षर और स्क्रीनशॉट, जिनमें से आधे बेमानी हैं। खासकर उन लोगों के लिए जो पहले से ही विषय में हैं।



आवश्यक शर्तें



हमें जिस कार्य की आवश्यकता है उसे प्राप्त करने के लिए:


कुछ शब्द, क्यों वास्तव में Netbeans। यह विकास वातावरण केवल एक ही है जिसमें आईडीई स्तर पर सी / सी ++ के लिए संस्करण नियंत्रण प्रणाली और समर्थन इकाई परीक्षणों के साथ एकीकृत करने की क्षमता शामिल है। इसका मतलब यह नहीं है कि इकाई परीक्षण बनाने के लिए अन्य आईडीई का उपयोग नहीं किया जा सकता है, इसका मतलब है कि इस आईडीई में अन्य आईडीई की तुलना में इकाई परीक्षण विकसित करना थोड़ा आसान है । यही है, शुरुआती लोगों के लिए यह आसान है।

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

एक हैलोवर्ल्ड प्रोजेक्ट बनाएँ



  1. वैकल्पिक। यदि आपके पास ऐसा अवसर है तो मैं एक नया भंडार बनाने की सलाह देता हूं। सिद्धांत "एक परियोजना - एक भंडार" एक बहुत अच्छा सिद्धांत है, मेरी राय में।
  2. आपके द्वारा उपयोग किए जा रहे भंडार की स्थानीय प्रति प्राप्त करें। तोड़फोड़ के लिए, यह चेकआउट है; गिट और मर्क्यूरियल के लिए, यह क्लोन है।
  3. रिपॉजिटरी में प्रोजेक्ट के लिए एक फ़ोल्डर बनाएं (यदि आपके पास एक अलग रिपॉजिटरी नहीं है तो यही स्थिति है)। मेरे मामले में, यह svn भंडार में 'unittests' फ़ोल्डर है।
  4. Netbeans लॉन्च करें:
    छवि
  5. एक नई परियोजना बनाएँ: मेनू फ़ाइल -> नई परियोजना।
  6. प्रोजेक्ट प्रकार के रूप में "C / C ++ एप्लिकेशन" चुनें
  7. छवि
  8. प्रोजेक्ट का नाम (मेरे पास 'helloworld'), और प्रोजेक्ट स्थान (प्रोजेक्ट स्थान) इंगित करें जिसमें यह स्थित होगा (मेरे स्क्रीनशॉट में यह वही फ़ोल्डर है जो मुझे तोड़फोड़ सर्वर से प्राप्त हुआ था। 'प्रोजेक्ट फ़ोल्डर' फ़ील्ड में आपको प्राप्त होगा। पूर्ण पथ जहाँ प्राप्त प्रोजेक्ट संग्रहीत किया जाएगा। शेष फ़ील्ड को अपरिवर्तित छोड़ा जा सकता है।
    छवि
  9. 'फिनिश' बटन पर क्लिक करें।
  10. उसके बाद, एकल स्रोत फ़ाइल वाली एक परियोजना बनाई जाएगी।
    छवि
  11. ध्यान दें कि फ़ाइल सूची में फ़ाइल 'main.cpp' हरे रंग में चिह्नित है। यह रंग उन नई फ़ाइलों को चिह्नित करता है जो रिपॉजिटरी में नहीं हैं।
  12. मुख्य मेनू में चयन करें: टीम -> तोड़फोड़ -> शो परिवर्तन (आप इस फ़ाइल पर राइट-क्लिक कर सकते हैं और पॉपअप मेनू में सबवर्सन -> शो परिवर्तन चुनें, लेकिन भविष्य में मैं मुख्य मेनू के माध्यम से विकल्प लिखूंगा)। स्क्रीन के निचले हिस्से में संशोधित फ़ाइलों की एक सूची दिखाई दी (अब के लिए यह केवल main.cpp है)।
    छवि
  13. आप इस फ़ाइल पर राइट-क्लिक कर सकते हैं और उदाहरण के लिए, देखें। हालांकि यह अभी तक दिलचस्प नहीं है, क्योंकि भंडार अभी भी खाली था।
    छवि
  14. बदलाव के लिए प्रतिबद्ध। प्रोजेक्ट ट्री और मुख्य मेनू में रूट का चयन करें: टीम -> तोड़फोड़ -> कमिट। जैसा कि आप यहाँ देख सकते हैं कि नेटबीन्स रिपॉजिटरी में 'हेलोवर्ल्ड' फोल्डर और मुख्य कोड फ़ाइल बनाएगा। साथ ही सभी प्रोजेक्ट फाइलें। यहां आप कमेंट में कमेंट जोड़ सकते हैं।
    छवि
  15. ध्यान दें कि प्रतिबद्ध होने के बाद, main.cpp फ़ाइल सूची काली हो गई। यही है, इस फ़ाइल में कोई परिवर्तन नहीं हैं।
  16. परिणामी परियोजना को बनाने और चलाने की कोशिश करना अच्छा होगा। प्ले बटन दबाएं (या मुख्य मेनू रन -> रन प्रोजेक्ट, या सिर्फ एफ 6)। यदि सबकुछ ठीक है, तो असेंबली के बाद आपको एक संदेश दिखाई देगा जैसे: “रन समाप्त; निकास मान 0; वास्तविक समय: 0ms; उपयोगकर्ता: 0ms; प्रणाली: 0ms »
  17. यदि ऐसा नहीं होता है, तो सबसे अधिक संभावना है कि पर्यावरण चर पैठ की सेटिंग्स या पुस्तकालयों की कमी के साथ कुछ समस्या है। आपके द्वारा प्राप्त संदेशों को ध्यान से देखें।
  18. मुख्य फ़ंक्शन में एक संदेश आउटपुट जोड़ें जैसे:
    cout << "Hello World!" << endl; 

  19. और हेडर फ़ाइल कनेक्शन जोड़ें:
     #include <iostream> 

  20. इसे फिर से चलाएं, F6।
  21. ध्यान दें कि जोड़ी गई लाइनों को लाइन के बाईं ओर हरे हाइलाइटिंग के साथ हाइलाइट किया गया है, और फ़ाइल सूची में संशोधित फ़ाइल अब नीली है। वास्तव में, आधुनिक आईडीई संस्करण नियंत्रण प्रणालियों के लिए बहुत अच्छे ग्राहक हैं। यदि आप टीम मेनू में उपलब्ध संभावनाओं का अध्ययन करते हैं, तो संभव है कि कुछ संस्करण नियंत्रण प्रणालियों के लिए आप तृतीय-पक्ष संस्करण नियंत्रण ग्राहकों का उपयोग करने से इनकार कर सकते हैं।
  22. अब अलग फाइलें अधिक मजेदार लग रही हैं।
    छवि
  23. चलो यह बदलाव भी करते हैं।


कमांड लाइन का निर्माण



स्वचालित असेंबली करने के लिए, हमें कमांड लाइन से निर्माण करने के लिए किसी प्रकार की असेंबली स्क्रिप्ट की आवश्यकता होती है। एक अच्छा विकल्प एक 'मेकफाइल' होगा (हालांकि मैं ऐसे लोगों को जानता हूं जो 'चींटी' का उपयोग करके C ++ प्रोजेक्ट बनाना पसंद करते हैं)। यदि आप जानते हैं कि इसे कैसे बनाया जाए, तो इसे करें और इस पैराग्राफ को आगे न पढ़ें। और अगर आप एक शुरुआती हैं, तो आपको कुछ के साथ आने की जरूरत है।

मेकफाइल बनाना एक अलग विषय है, जो इस लेख के ढांचे में फिट नहीं होता है। इसलिए, हम हमारे लिए सबसे आसान रास्ता तय करेंगे। Netbeans अपने प्रोजेक्ट को स्टोर करता है, वास्तव में, मेकफाइल के रूप में (हालांकि इसमें अतिरिक्त फ़ाइलों का एक गुच्छा भी है)। हम इसे मेकफाइल के रूप में उपयोग करेंगे।

सामान्यतया, यह सवाल कि क्या भंडार में परियोजना फाइलों को संग्रहीत करने के लायक है या नहीं यह एक बहुत ही विवादास्पद मुद्दा है। मेरा मानना ​​है कि नहीं। लेकिन असेंबली की स्क्रिप्ट रिपॉजिटरी में होनी चाहिए। इस मामले में Netbeans प्रोजेक्ट एक ऐसा समझौता है। चूंकि, जैसा कि मैंने कहा, Netbeans प्रोजेक्ट फाइलें वास्तव में, एक विधानसभा स्क्रिप्ट हैं। सबसे अच्छा नहीं है, लेकिन अभी भी एक विधानसभा स्क्रिप्ट।

  1. एक टर्मिनल खोलें (विंडोज उपयोगकर्ताओं के लिए cmd.exe या FAR)।
  2. प्रोजेक्ट फ़ोल्डर पर जाएं ('/ home / risik / work / unittests / helloworld' मेरे साथ)।
  3. कमांड लाइन से कमांड 'क्लीन' को रन करें और फिर 'मेक' करें
  4. यदि आपको Netbeans से प्रोजेक्ट बनाने में कोई समस्या नहीं थी, तो कोई समस्या नहीं होनी चाहिए।
  5. यह ऐसी फाइलें हैं जो हमने पहले प्रोजेक्ट फाइलों के साथ मिलकर की थीं। लेकिन आप, किसी कारण से, ऐसा नहीं किया, तो यह करने का समय है।
  6. Netbeans से: प्रोजेक्ट पर राइट-क्लिक करें, और फिर: सबवर्सन -> कमिट करें। हालाँकि, Netbeans में एक छोटी सी गलती प्रतीत होती है। अन्य फ़ाइलों में, मेरे प्रोजेक्ट फ़ोल्डर में '.dep.inc' नाम की एक फ़ाइल है, जो निर्भरता के सही प्रसंस्करण के लिए आवश्यक है। आप इसके बिना कर सकते हैं - विधानसभा काम करती है, लेकिन इसे खुद से जोड़ना बेहतर है।
  7. दूसरा विकल्प कमांड लाइन से है या जो आप आमतौर पर अपने संस्करण नियंत्रण प्रणाली के साथ काम करने के लिए उपयोग करते हैं।


मुझे फाइलों की निम्नलिखित सूची मिली:
परियोजना की जड़:

nbproject फ़ोल्डर:

nbproject / निजी फ़ोल्डर:


जेनकींस प्रारंभिक सेटअप



  1. अपने ब्राउज़र में जेनकींस खोलें (मेरे स्क्रीनशॉट में यह 192.168.1.109:8080/jenkins पर स्थित है)।
  2. एक नया कार्य बनाएं (जेनकिंस - नई नौकरी)
  3. कार्य के लिए एक नाम निर्दिष्ट करें और कार्य प्रकार "एक फ्री-स्टाइल सॉफ़्टवेयर प्रोजेक्ट बनाएँ" चुनें।
    छवि
  4. स्क्रीनशॉट के समान कॉन्फ़िगरेशन सेट करें।
    छवि
    छवि
  5. आइए अधिक विस्तार से विचार करें कि जिन क्षेत्रों को संशोधित किया जाना चाहिए।
    - काम का नाम। मैं सिर्फ यह कहता हूं - हेलोवर्ल्ड-सीपीपी
    - सेक्शन 'सोर्स कोड मैनेजमेंट' में इस्तेमाल किए गए वर्जन कंट्रोल सिस्टम के प्रकार को दर्शाते हैं। मेरे पास यह 'तोड़फोड़' है।
    - अतिरिक्त क्षेत्र अलग-अलग संस्करण नियंत्रण प्रणालियों के लिए भिन्न होते हैं, एसवीएन के लिए उनमें से सबसे महत्वपूर्ण रिपॉजिटरी यूआरएल है।
    चेतावनी: जब आप इस url को पूछते हैं, तो सबसे अधिक संभावना है कि आपके जेनकिन्स "मैं भंडार से कनेक्ट नहीं कर सकता" की भावना में कुछ कहूंगा। एक लंबे लाल लॉग ट्रेस के अंत में आप शब्द पा सकते हैं: '(हो सकता है कि आपको क्रेडेंशियल दर्ज करने की आवश्यकता है?)' और अपना लॉगिन और पासवर्ड दर्ज करने के लिए एक लिंक। रिपॉजिटरी को अपना उपयोगकर्ता नाम और पासवर्ड प्रदान करें, और जेनकिंस इसे याद रखेंगे। एक अन्य विकल्प सीधे उपयोगकर्ता नाम और पासवर्ड को url में निर्दिष्ट करना है। या तीसरा विकल्प प्रमाणीकरण सूचना को सीधे उपयोगकर्ता के होम फ़ोल्डर में रखना है जिसके तहत जेनकिंस काम करता है।
    - 'बिल्ड ट्रिगर' सेक्शन में मैंने SCM असेंबली का संकेत दिया। यानी अनुसूचित विधानसभा। '* / 15 * * * *' का अर्थ है हर 15 मिनट में असेंबली।
    - नोट: सामान्य तौर पर, SCM के बजाय, आपके संस्करण नियंत्रण प्रणाली से ट्रिगर के अनुसार पुश असेंबली का उपयोग करना बेहतर होगा, लेकिन इस तरह का कॉन्फ़िगरेशन बनाना इस लेख के दायरे से बाहर है।
    - सेक्शन 'बिल्ड' में 'Execute Shell' टाइप का नया बिल्ड स्टेप जोड़ें। यदि आपके पास जेनकिंस विंडोज पर चल रहा है और आपके पास इस सर्वर पर साइबरविन स्थापित नहीं है (आप भी कैसे रहते हैं, यदि ऐसा है?), तो विकल्प 'एक्सट्यूट विंडोज बैच कमांड' का चयन करना बेहतर हो सकता है।
  6. सहेजें बटन दबाएं और चलो प्रोजेक्ट को इकट्ठा करने का प्रयास करें।
  7. यह मेरे पास गिर गया। यदि आप 'कंसोल लॉग' को देखते हैं तो समस्या आसानी से स्थानीय हो जाती है:
     Started by user anonymous Building in workspace /var/lib/jenkins/jobs/helloworld-cpp/workspace Checking out a fresh workspace because there's no workspace at /var/lib/jenkins/jobs/helloworld-cpp/workspace Cleaning local Directory . Checking out https://sergeyborisov.com/svn/teach/kcup_unittests/helloworld at revision '2013-02-25T01:37:54.054 +0700' A main.cpp A nbproject A nbproject/Makefile-Release.mk A nbproject/Makefile-impl.mk A nbproject/Package-Release.bash A nbproject/project.xml A nbproject/Makefile-Debug.mk A nbproject/Makefile-variables.mk A nbproject/configurations.xml A nbproject/private A nbproject/private/Makefile-variables.mk A nbproject/private/configurations.xml A nbproject/private/private.xml A nbproject/Package-Debug.bash A Makefile U . At revision 132 [workspace] $ /bin/sh -xe /tmp/hudson8376440745271858508.sh + make all /tmp/hudson8376440745271858508.sh: 2: /tmp/hudson8376440745271858508.sh: make: not found Build step 'Execute shell' marked build as failure Finished: FAILURE 

  8. वैसे, यहाँ सब कुछ सरल है। मेरे सर्वर में 'मेक' कमांड नहीं थी।
  9. और दूसरी पुनरावृत्ति के बाद, मुझे पता चला कि मेरे पास जी ++ नहीं है। खैर, इसे खत्म करना भी आसान है।
  10. केवल तीसरी बार सब कुछ ठीक निकला
     Started by user anonymous Building in workspace /var/lib/jenkins/jobs/helloworld-cpp/workspace Updating https://sergeyborisov.com/svn/teach/kcup_unittests/helloworld at revision '2013-02-25T01:42:03.200 +0700' At revision 132 no change for https://sergeyborisov.com/svn/teach/kcup_unittests/helloworld since the previous build [workspace] $ /bin/sh -xe /tmp/hudson8326466894395366933.sh + make all for CONF in Debug Release ; \ do \ "make" -f nbproject/Makefile-${CONF}.mk QMAKE= SUBPROJECTS= .build-conf; \ done make[1]: Entering directory `/var/lib/jenkins/jobs/helloworld-cpp/workspace' "make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/helloworld make[2]: Entering directory `/var/lib/jenkins/jobs/helloworld-cpp/workspace' mkdir -p build/Debug/GNU-Linux-x86 rm -f build/Debug/GNU-Linux-x86/main.od g++ -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.od -o build/Debug/GNU-Linux-x86/main.o main.cpp mkdir -p dist/Debug/GNU-Linux-x86 g++ -o dist/Debug/GNU-Linux-x86/helloworld build/Debug/GNU-Linux-x86/main.o make[2]: Leaving directory `/var/lib/jenkins/jobs/helloworld-cpp/workspace' make[1]: Leaving directory `/var/lib/jenkins/jobs/helloworld-cpp/workspace' make[1]: Entering directory `/var/lib/jenkins/jobs/helloworld-cpp/workspace' "make" -f nbproject/Makefile-Release.mk dist/Release/GNU-Linux-x86/helloworld make[2]: Entering directory `/var/lib/jenkins/jobs/helloworld-cpp/workspace' mkdir -p build/Release/GNU-Linux-x86 rm -f build/Release/GNU-Linux-x86/main.od g++ -c -O2 -MMD -MP -MF build/Release/GNU-Linux-x86/main.od -o build/Release/GNU-Linux-x86/main.o main.cpp mkdir -p dist/Release/GNU-Linux-x86 g++ -o dist/Release/GNU-Linux-x86/helloworld build/Release/GNU-Linux-x86/main.o make[2]: Leaving directory `/var/lib/jenkins/jobs/helloworld-cpp/workspace' make[1]: Leaving directory `/var/lib/jenkins/jobs/helloworld-cpp/workspace' Finished: SUCCESS 



नेटबीन्स में परीक्षण बनाना


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

  1. 'स्रोत फ़ाइलें' पर राइट-क्लिक करें और संदर्भ मेनू से नया -> C ++ वर्ग चुनें।
  2. कक्षा निर्माण संवाद में, नई कक्षा का नाम सेट करें, उदाहरण के लिए, हैलो (मुझे इस नाम के लिए क्षमा करें, लेकिन मैं यह पता नहीं लगा सका कि इसे क्या कहा जाए)। सामान्य तौर पर, यहां नई फ़ाइल के लिए फ़ोल्डर सेट करना सही होगा। ठीक है, कम से कम 'src'। लेकिन मैं बहुत आलसी था।
    छवि
  3. फ़ाइलों की एक सूची फ़ाइलों की सूची में दिखाई देगी - Helloer.cpp और Helloer.h। नेटबीन्स में, वे एक फ़ोल्डर में बनाए जाते हैं, और अन्य आईडीई में, उन्हें दो अलग-अलग फ़ोल्डरों में बनाया जा सकता है, उदाहरण के लिए, 'src' और 'शामिल'।
  4. जैसा कि आप कंस्ट्रक्टर को मापदंडों के बिना देख सकते हैं, कॉपी कंस्ट्रक्टर और वर्चुअल डिस्ट्रक्टर स्वचालित रूप से बनाए जाते हैं।
  5. सबसे पहले, प्रतिबद्ध करें कि क्या उत्पन्न हुआ था, और फिर हमें जो कुछ भी चाहिए उसे जोड़ें। छविछविछवि
  6. यही है, मैंने एक निर्माता को एक स्ट्रिंग के साथ हेलर वर्ग में जोड़ा, एक पैरामीटर के रूप में जिसमें यह इंगित किया जाएगा कि हम किसका स्वागत करेंगे। और बधाई संदेश प्राप्त करने के लिए एक विधि भी जोड़ी।
  7. परिवर्तन करें। कृपया ध्यान दें कि परियोजना फाइलों को भी संशोधित किया गया है, उन्हें भी प्रतिबद्ध होना चाहिए।
  8. Helloer.h खोलें, फ़ाइल के अंदर राइट-क्लिक करें और Create Test -> Create CppUnit Test चुनें।
  9. दिखाई देने वाले संवाद में, उन वस्तुओं का चयन करें जिन्हें आप परीक्षण करना चाहते हैं। मैंने केवल संदेश पद्धति को चुना। छवि
  10. अगले संवाद में, परीक्षण का नाम निर्दिष्ट करें। वैसे, अगर नेटबीन्स को आवश्यक पुस्तकालय (कैपपिट) नहीं मिला, तो वह आपको इसके बारे में यहां बताएंगे। मेरे पास यह पैकेज libcppunit-dev है।
    छवि
  11. परीक्षण उत्पन्न करने के बाद मुझे यही मिला। छवि
  12. HelloWorldTests शाखा परियोजना संरचना में दिखाई दी - यह वह नाम है जिसे मैंने परीक्षण कॉन्फ़िगरेशन संवाद में परीक्षणों के पूरे समूह को दिया था। और इसमें इस समूह (रनर) के परीक्षण चलाने के लिए मॉड्यूल है, जिसे मैंने 'HelloWorldTestRunner.cpp' कहा है और अब तक एकमात्र परीक्षण वर्ग HelloerTest ((.cpp + .h) है।
  13. चलो दौड़ने की कोशिश करते हैं। रन मेनू -> टेस्ट प्रोजेक्ट। iii ... मुझे एक फ़ाइल मिली - इकाई परीक्षण एकत्र नहीं किए गए थे। चूंकि कोई हेडर फ़ाइल 'Helloer.h' नहीं थी। वैसे यहाँ सरल है - आपको फ़ाइल में पथ जोड़ने की आवश्यकता है। ऐसा करने के लिए, HelloWorldTests परीक्षण समूह पर संदर्भ मेनू को कॉल करें और गुण आइटम का चयन करें। आप प्रोजेक्ट फ़ोल्डर गुण संवाद देखेंगे। छवि
  14. इस संवाद में, 'C ++ कंपाइलर' अनुभाग में, 'निर्देशिकाएँ शामिल करें' आइटम ढूंढें और दाईं ओर '...' बटन पर क्लिक करें।
  15. दिखाई देने वाले 'निर्देशिकाएँ शामिल करें' संवाद में, 'जोड़ें' बटन पर क्लिक करें छवि
  16. अंत में, उस फ़ोल्डर का चयन करें जहां आपकी हेडर फ़ाइल स्थित है। चूंकि यह फ़ाइल परियोजना का हिस्सा है, फ़ाइल पथ को सापेक्ष रूप में संग्रहीत किया जाना चाहिए, जो संवाद के दाईं ओर इंगित किया गया है। चूंकि मैं 'src' फ़ोल्डर बनाने के लिए बहुत आलसी था, जब मैंने Helloer वर्ग बनाया था, तो यह फ़ोल्डर प्रोजेक्ट फ़ोल्डर होगा। वह है, फ़ोल्डर '।' छवि
  17. गुण संवाद बंद करें और इकाई परीक्षण को फिर से चलाने का प्रयास करें।
  18. इस बार यह एक साथ मिला, शुरू हुआ, लेकिन गिर गया, जोर देने पर। छवि
  19. हालाँकि, मैंने तुरंत वह सब कुछ किया जो उत्पन्न हुआ था। और अब मैं परीक्षण को ठीक करूंगा:
    छवि
  20. और मैं भी बदलूंगा। कृपया ध्यान दें कि आपको न केवल स्रोत कोड, बल्कि प्रोजेक्ट फ़ाइलों को भी प्रतिबद्ध करने की आवश्यकता है।
  21. फ़ाइल खोलें 'HelloWorldTestRunner.cpp' यदि आप बारीकी से देखते हैं, तो इसकी संरचना सरल और सीधी है:
    - हम एक टेस्ट रन तैयार कर रहे हैं।
    - उन्हें दूर भगाओ।
    - हम परिणाम प्रिंट करते हैं।
  22. नेटबीन्स ने 'कंपाइलर कम्पेटिबल' प्रारूप में परिणाम का एक प्रिंट तैयार किया। यह नेटबींस में काम करने के लिए एक बहुत ही सुविधाजनक प्रारूप है, लेकिन जेनकिंस के लिए एक असुविधाजनक प्रारूप है। इसलिए, मैं XML प्रारूप में मुद्रण भी जोड़ूंगा:
     ofstream xmlFileOut("cpptestresults.xml"); XmlOutputter xmlOut(&result, xmlFileOut); xmlOut.write(); 
  23. स्वाभाविक रूप से, आपको आवश्यक हेडर फ़ाइलों को शामिल करना होगा:
     #include <cppunit/XmlOtputter.h> #include <ostream> 
  24. नोट: XML स्वरूप में मुद्रण, पाठ के बजाय, पाठ के साथ नहीं।
  25. फ़ाइल का नाम ("मेरे लिए cpptestresults.xml") और इसके लिए रास्ता अलग चुना जा सकता है। लेकिन मुख्य बात यह है कि आपको पता होगा कि कौन सा है। हमें जल्द ही इस जानकारी की आवश्यकता होगी।


जेनकिंस ऑटो टेस्ट रन कॉन्फ़िगर करें


  1. मैंने जेनकिंस के साथ एक ब्राउज़र खोला और मैं देखता हूं कि वह पहले से ही कई विधानसभाएं बना चुका है। मैंने उन्हें हर 15 मिनट में एससीएम विधानसभा बताया। और इसलिए, अगर अगले चेक के दौरान, जो हर 15 मिनट में किया जाता है, जैसा कि आप अनुमान लगा सकते हैं, रिपॉजिटरी में नए कमिट थे, तो जेनकिंस ने प्रोजेक्ट एकत्र किया। खैर, जब से मैंने यह सब धीरे-धीरे लिखा है, उन्होंने एक-दो रन के लिए कारण पाया :)
  2. यहाँ एक महत्वपूर्ण बारीकियाँ है। यदि आपकी रिपॉजिटरी के साथ सर्वर का सिस्टम टाइम और जेनकिंस डाइवर के साथ सर्वर का सिस्टम समय है, तो आप बहुत ही अजीब प्रभाव प्राप्त कर सकते हैं। उदाहरण के लिए, जेनकिंस भविष्य में स्रोत कोड के संभावित संशोधनों को स्वीकार करने से इनकार कर देगा। इसलिए, मैं सभी सर्वरों पर समय तुल्यकालन स्थापित करने और कुछ सामान्य एनटीपी सर्वरों के लिए सभी को सर्वश्रेष्ठ करने की सलाह देता हूं। हां, और आपका डेस्कटॉप समान तरीके से सिंक्रोनाइज़ करना अच्छा होगा।
  3. उदाहरण के लिए, नौकरी में "पोस्ट बिल्ड एक्शन" जोड़ें:
    छवि
  4. हम इकट्ठा करने की कोशिश कर रहे हैं। और आवाज! सब कुछ इकट्ठा है और परीक्षण पारित कर दिया! और आपको बिल्ड में दिए गए परीक्षणों की जानकारी है:
    छवि
  5. और वह इसे फिर से इकट्ठा करने के बाद, नौकरी में एक ग्राफ दिखाई देता है। खैर, जबकि मेरे पास यह है:
    छवि
  6. लेकिन 'नवीनतम टेस्ट परिणाम' में आप सभी उत्तीर्ण और अनुत्तीर्ण परीक्षणों (अब तक केवल एक ही) के बारे में अधिक विस्तृत जानकारी देख सकते हैं:
    छवि
  7. शर्मिंदा न हों कि सामान्य परीक्षणों की तालिका में आप देखें (रूट)। जेनकिन्स जावा के तहत जमीन है। और पैकेज के नाम होने चाहिए थे।
  8. एक और परीक्षण करते हैं। उसी समय, हम तुरंत कार्यक्षमता के एक छोटे संशोधन को ध्यान में रखेंगे: यदि कोई अभिवादन करने वाला नहीं है (स्ट्रिंग 'जो' सेट नहीं है), तो कोई अभिवादन नहीं कहा जाना चाहिए।
  9. अर्थात्, हमें हेडर फ़ाइल में निम्नलिखित पंक्तियाँ जोड़नी होंगी:
    छवि
  10. और .cpp फ़ाइल के लिए इस तरह की एक विधि:
     void HelloerTest::testMessageNobody() { Helloer helloer; string result = helloer.message(); if (true /*check result*/) { CPPUNIT_ASSERT(result == ""); } } 
  11. करता है। और अब हम या तो एससीएम का उपयोग करके विधानसभा के अगले लॉन्च की प्रतीक्षा कर रहे हैं या हम विधानसभा को मैन्युअल रूप से लॉन्च कर रहे हैं।
  12. अब हम देखते हैं कि हमारे पास एक गिरी हुई परीक्षा है!
    छवि
  13. सच है, विधानसभा अभी भी सफल के रूप में चिह्नित है। आइए इस मुद्दे पर थोड़ी देर बाद लौटते हैं।
  14. लेकिन यह प्रवृत्ति प्रचलित हो गई है:
    छवि
  15. परिणामी परीक्षा को ठीक करें:
     string Helloer::message() const { if (who.length() == 0) return ""; return (string)"Hello " + who; } 

  16. और फिर से, आईडीई में परीक्षण चलाएं। अब सब ठीक है। चलो प्रतिबद्ध है, हम जेनकिंस की तरफ इकट्ठा करेंगे और देखेंगे कि वहां भी, सब कुछ अब ठीक है (मैं अभी भी टूटे हुए परीक्षण के साथ विधानसभा के माध्यम से प्राप्त करने में कामयाब रहा)।
    छवि
  17. विधानसभा की स्थिति के बारे में कुछ शब्द। जेनकिन्स आपको स्थिति के गठन को काफी लचीला बनाने की अनुमति देता है। यह कॉन्फ़िगरेशन कार्य में xUnit चरण सेटिंग - आइटम 'विफल परीक्षण' और 'स्किप किए गए परीक्षण' में देखा जा सकता है। यह आपके लिए विशेष रूप से कैसे बेहतर होगा - मुझे नहीं पता। लेकिन मेरा मानना ​​है कि प्रत्येक नए गिरे हुए परीक्षण को विधानसभा के टूटने की ओर ले जाना चाहिए, अर्थात विधानसभा को लाल रंग में चिह्नित किया जाना चाहिए। लेकिन वे परीक्षण जो पहले टूट गए थे, उन्हें "पीली स्थिति" में ले जाना चाहिए। प्रयोग!

खैर, यह बात है! यदि आप पृष्ठ के निचले भाग तक स्क्रॉल करने के बजाय सभी चरणों में यहाँ तक पहुँच गए हैं, तो आपने अपने C ++ प्रोजेक्ट में इकाई परीक्षणों के रन को स्वचालित करने में पहला कदम उठाया। और टीडीडी के लिए पहला कदम। सौभाग्य है

संदर्भ



लाइसेंस


क्रिएटिव कॉमन्स लाइसेंस

सर्गेई बोरिसोव (AKA रिसिक) द्वारा " यूनिट परीक्षण और निरंतर एकीकरण के लिए जेनकिन्स का उपयोग C ++ परियोजनाओं के लिए " लेख एक क्रिएटिव कॉमन्स एट्रीब्यूशन- नॉन-कॉमर्शियल-शेयरअलाइल 3.0 अनपोर्टेड लाइसेंस के तहत लाइसेंस प्राप्त है।

Source: https://habr.com/ru/post/In170847/


All Articles