2012-08-30 18 views
8

के लिए सिंगल-सोर्स यूनिट परीक्षण क्या यूनिट परीक्षण लिखने का कोई तरीका है ताकि उन्हें संकलित और डेल्फी और फ्री पास्कल दोनों के साथ चलाया जा सके?फ्री पास्कल और डेल्फी

डेल्फी और मुफ्त पास्कल, जो डेवलपर्स जो दोनों compilers (उदाहरण, पुस्तकालय और ढांचे डेवलपर्स के लिए) को लक्षित के लिए डुप्लिकेट काम का कारण बनता है के लिए अलग इकाई परीक्षण चौखटे रहे हैं।

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

तो अनिवार्य रूप से सवाल यह है:

  • जो रूपरेखा (DUnit या FPCUnit) यथासंभव कम संशोधनों के साथ दोनों compilers (डेल्फी और मुफ्त पास्कल) के साथ संकलित किया जा सकता?

या

  • वहाँ एक तिहाई ढांचे डेल्फी और पांचवें वेतन आयोग के साथ काम करता (TSynTest उल्लेख के लिए अरनॉड के लिए धन्यवाद) क्या है?
+0

आप विशेष रूप से एफपीसी में डुनिट परीक्षण लिखने के लिए कहते हैं। यह स्पष्ट रूप से संभव नहीं है। लेकिन क्या आप वास्तव में पूछने के लिए क्या मतलब है? या आप बस कुछ यूनिट परीक्षण ढांचे में कोड लिखना चाहते हैं? मेरे जवाब ने चेहरे के मूल्य पर सवाल उठाया। अन्य उत्तरों ने एक और अधिक व्याख्यात्मक व्याख्या ग्रहण की। जो यह है? –

+0

@ डेविड हेफरनन इसे इंगित करने के लिए धन्यवाद, मैंने प्रश्न संशोधित किया और एफपीसीनिट/यूनिट परीक्षण टैग – mjn

+0

जोड़ा, अच्छा, अब मैं उत्तर को हटा सकता हूं जो अब सटीक नहीं है। अब सवाल बहुत बेहतर है। –

उत्तर

6

डिफ़ॉल्ट इकाई परीक्षण ढांचे, FPCUnit है यह DUnit रूप में एक ही डिजाइन किया गया है, लेकिन मामूली विवरण में यह से अलग। {$IFDEF FPC} द्वारा मतभेदों को बाधित करके आप एफपीसीयूनीट और डुनिट के लिए सामान्य यूनिट परीक्षण लिख सकते हैं। मैंने अभी एफपीसीयूनीट का परीक्षण किया है, यह एक प्रयोग योग्य ढांचा है, और blogged about it है।

3

मैं सिर्फ एक नमूना है कि दोनों DUnit (डेल्फी) और FPCUnit (DUnit, कि लाजर 1.0 में, जो FreePascal 2.6 शामिल हैं "बॉक्स में" पहले से ही जहाज के लिए होता है के सबसे नजदीक FreePascal समकक्ष) में काम करता है ऊपर मार पड़ी है:

आईएफडीईएफ का एक छोटा सा हिस्सा और आप वहां हैं। के लिए नि: शुल्क पास्कल

unit TestUnit1; 

{$IFDEF FPC} 
{$mode objfpc}{$H+} 
{$ENDIF} 

interface 

uses 
    Classes, 
    {$ifdef FPC} 
    fpcunit, testutils, testregistry, 
    {$else} 
    TestFramework, 
    {$endif} 
    SysUtils; 

type 
    TTestCase1= class(TTestCase) 
    published 
    procedure TestHookUp; 
    end; 

implementation 

procedure TTestCase1.TestHookUp; 
begin 
    Self.Check(false,'value'); 
end; 

initialization 
    RegisterTest(TTestCase1{$ifndef FPC}.Suite{$endif}); 
end. 
+3

यदि आप आगे बढ़ेंगे तो आपको अन्य मतभेद मिलेंगे, जैसे कि 'टीटेस्टकेस। चेक एक्वाल्स', डुनिट में 'टीटेस्टकेस.एएसएसर्ट एक्वाल्स' एफपीसीयूनीट है। आपको कुछ और {$ IFDEF} की आवश्यकता है। – kludg

+1

मैं ifdef के साथ अपने सभी कोड कूड़े होने से बचने के लिए एक रैपर वर्ग के लिए जाना होगा ... –

+0

बिल्कुल। एफपीसीयूनीट से सबक्लास टीटेस्टकेस, और यूनिट को टेस्टफ्रेमवर्क के रूप में सहेजें। शायद टेस्ट यूटिल्स और टेस्ट रजिस्ट्री से आपको जो कुछ भी चाहिए, उसे बस काम करें। –

10

यह very nice blog article देखें - एफपीसीयूनीट परीक्षण के बारे में केवल ताजा मांस।

संक्षेप में, जहाँ तक मुझे पता है, और आप अगर compare to DUnit:

  • अधिकांश चेक *() तरीकों जोर * नाम दिया गया();
  • सेटअप/टियरडाउन तरीकों दोनों ढांचे में प्रति-समारोहकहा जाता है,
  • कुछ अन्य सोच भिन्न हो सकते हैं।

तो, मैं इसे DUnit साथ की तुलना में एक ही सटीक तरीकों के लिए, यह बताने के लिए FPCUnit "की नकल करता है" DUnit आसान हो सकता है FPCUnit कार्यान्वयन के ऊपर एक छोटे आवरण वर्ग बनाकर लगता है। तो आप दो लक्ष्यों के बीच कोड साझा करने में सक्षम हो सकते हैं, और मौजूदा डीयूनिट परीक्षणों का पुनः उपयोग भी कर सकते हैं। इस तरह का एक रैपर वर्ग आईएमएचओ अधिक सुविधाजनक है कि {$ifdef FPC} का उपयोग करके अन्य सुझाव दिया गया है। सशर्त संकलन डीबग, वर्बोज़, अनावश्यक करने के लिए कोड को कठिन बना देता है और केवल तभी उपयोग किया जाना चाहिए जब आवश्यक हो।

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

+1

वैसे भी, ['सर्ग का उल्लेख किया गया]] (http://stackoverflow.com/a/12209940/960757) उनके आज के ब्लॉग पोस्ट ;-) दोनों को +1 ... – TLama

+0

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

+0

'TSynTest' डिफ़ॉल्ट रूप से बहुत verbose नहीं है: यह प्रति परीक्षण विधि चलाने के लिए एक पंक्ति प्रदर्शित करेगा। आप आउटपुट को रीडायरेक्ट भी कर सकते हैं। लॉगिंग सक्षम करते समय, आपके पास बहुत सारी सामग्री है (कई 100 एमबी)। बेशक, यदि आपके पास प्रति विधि केवल एक या दो assert है, तो यह verbose बन जाएगा। वास्तव में, टेस्ट डिज़ाइन का उपयोग परीक्षण के लिए छोटे निजी या सार्वजनिक तरीकों के लिए होता है, फिर प्रकाशित विधियों के भीतर परीक्षणों को फिर से व्यवस्थित करें, स्पष्ट नामों के साथ, प्रदर्शित होने के लिए तैयार। तो आपके पास छोटी ग्रैन्युलरिटी हो सकती है, लेकिन प्रति परीक्षण कक्षा या विधि में एक टेस्ट विधि की अपेक्षा न करें। उदाहरण के लिए, हमारे एमओआरएमओटी 10,000,000 परीक्षणों के करीब चलाते हैं। –

संबंधित मुद्दे