2011-09-01 17 views
28

लॉन्च किए बिना एक्सकोड 4 में लॉजिक परीक्षण चलाएं मैं सिम्युलेटर लॉन्च किए बिना ओसीयूनीट का उपयोग कर एक्सकोड 4 में परीक्षण चलाने के लिए चाहता हूं। कृपया, मुझे कोशिश न करें और मुझे विश्वास न करें मैं यूनिट परीक्षण गलत कर रहा हूं या ऐसा कुछ भी कर रहा हूं। मैं पारंपरिक तरीके से टीडीडी करना चाहता हूं: परीक्षण में कक्षा के लिए एपीआई लिखें, फिर कक्षा को परीक्षण पास करें। मैं अलग-अलग परीक्षण लिखूंगा जो सिम्युलेटर में चलने वाले अंत तक हैं।सिम्युलेटर

यदि ऐसा करने का कोई तरीका नहीं है, तो कृपया कोई मुझे बता सकता है कि टेस्ट दोहन कैसे पूरे ऐप को तुरंत चालू नहीं कर सकता है? मेरा ऐप घटना संचालित है, और यह घटनाओं का एक गुच्छा भेजता है जब यह मेरे परीक्षणों के साथ उस गड़बड़ को शुरू करता है।

उत्तर

3

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

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

0

मैंने ओएसएक्स/आईओएस संगत परीक्षण सूट बनाने के लिए GHUnit का उपयोग किया है। कुछ मुद्दे हैं, लेकिन मैंने पाया कि यह ओसीयूनीट की तुलना में अधिक विश्वसनीय/संगत/सीधा था।

GHUnit ओएस एक्स और आईओएस के लिए बुनियादी टेम्पलेट परियोजनाएं प्रदान करता है, जो प्रारंभिक सेटअप को सरल बनाता है।

नोट: मैं आम तौर पर अपने अधिकांश परीक्षण के लिए अपनी खुद की किट का उपयोग करता हूं।

28

कृपया कोई मुझे बता सकता है कि टेस्ट दोहन कैसे पूरे ऐप को तुरंत चालू नहीं कर सकता है? मेरा ऐप घटना संचालित है, और यह घटनाओं का एक गुच्छा भेजता है जब यह मेरे परीक्षणों के साथ उस गड़बड़ को शुरू करता है।

मैं एक्सकोड 4 के अंतर्निर्मित परीक्षण का उपयोग करता हूं। ऐप इंस्टेंटेशन दर्द की तरह प्रतीत हो सकता है, लेकिन जैसा कि मैं Xcode Unit Testing: The Good, the Bad, the Ugly पर लिखता हूं, यह तर्क परीक्षण और एप्लिकेशन परीक्षणों के बीच अंतर किए बिना परीक्षण लिखना संभव बनाता है। विशेष रूप से, यह मुझे दृश्य नियंत्रकों के लिए यूनिट परीक्षण लिखने देता है।

यहाँ क्या मैं अपना पूरा स्टार्टअप अनुक्रम बचने के लिए क्या है:

संपादित योजना

  • टेस्ट कार्रवाई
  • का चयन करें "टेस्ट" में तर्क टैब का चयन करें
  • अक्षम " रन एक्शन के विकल्प का प्रयोग करें "
  • एक पर्यावरण चर जोड़ें, runningTestsपर सेट करें

संपादित अपने अनुप्रयोग प्रतिनिधि

  • -application:didFinishLaunchingWithOptions: पर निम्नलिखित को जोड़ जैसे ही यह करने के लिए समझ में आता है:

    #if DEBUG 
        if (getenv("runningTests")) 
         return YES; 
    #endif 
    
  • -applicationDidBecomeActive: लेकिन बस return लिए भी यही करें।

अद्यतन: मैंने अपना दृष्टिकोण बदल दिया है। How to Easily Switch Your App Delegate for Testing देखें।

+0

इस संकेत के लिए धन्यवाद! इसका इस्तेमाल किया और पूरी तरह से काम किया। – yonel

+1

मुझे लगता है कि यह केवल उनके जीयूआई को एप्लिकेशन में लोड करने वाले अनुप्रयोगों के लिए काम करता है: didFinishLaunchingWithOptions:। क्या होगा यदि आप एक ऐप बना रहे हैं जो स्टोरीबोर्ड का उपयोग करता है? – ABeanSits

+0

मुझे वास्तव में यह कोड कहां रखना चाहिए? मेरे वर्तमान लक्ष्य में ऐपडिलेगेट नहीं है। और यदि मैं इसे अपने यूनिटटेस्ट लक्ष्य में जोड़ता हूं, तो यह कुछ भी नहीं बदलता है। (मैं एक्सकोड 4.6 का उपयोग कर रहा हूं) –

2

यह पहले के जवाब में बताया गया था कि तर्क परिदृश्य इस परिदृश्य के लिए सही काम है। XCode संस्करण 4.3.2 (4E2002) के साथ काम कर रहे तर्क परीक्षण प्राप्त करने में मुझे बहुत कठिन समय था। Apple's sample unit test project पर देखकर मुझे यह समझने में मदद मिली कि स्पष्ट अलगाव के साथ इसे कैसे किया जाए। उस उदाहरण में, लॉजिक परीक्षण लाइब्रेरी लक्ष्य से फ़ाइलों का परीक्षण करता है, न कि एप्लिकेशन लक्ष्य। मॉडल को एक पुस्तकालय में शामिल किया गया था जिसे तब मुख्य लक्ष्य और तर्क परीक्षण लक्ष्य से जोड़ा गया था। आवेदन लक्ष्य में केवल विचार और नियंत्रक शामिल थे।

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

मैं कल्पना कर सकता हूं कि ये निर्देश थोड़ा उलझन में हैं। यदि आप उपरोक्त वर्णित नमूना परियोजना को विच्छेदन करते हैं तो आपको एक बेहतर विचार मिलेगा।

2

ध्यान दें, Xcode 5.

पर अपरीक्षित मैं @ जॉन-रीड के जवाब थे, लेकिन पाया गया कि Xcode XcodeProjects की xcuserstated हिस्सा करने के लिए पर्यावरण के चर कहते हैं, और इन उपयोगकर्ता विशिष्ट और आम तौर पर करने के लिए प्रतिबद्ध नहीं हैं भंडार इस प्रकार मैं अपने AppDelegate धूर्तता अपनी लोड हो रहा है ओवरराइड करने के लिए:,

@implementation MyAppDelegate (Testing) 

+ (void)initialize { 
    SEL new = @selector(application:didFinishLaunchingWithOptions:); 
    SEL orig = @selector(swizzled_application:didFinishLaunchingWithOptions:); 
    Class c = [self class]; 
    Method origMethod = class_getInstanceMethod(c, orig); 
    Method newMethod = class_getInstanceMethod(c, new); 

    if (class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) { 
     class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
    } else { 
     method_exchangeImplementations(origMethod, newMethod); 
    } 
} 

- (BOOL)swizzled_application:(id)app didFinishLaunchingWithOptions:(id)opts { 
    return YES; 
} 

@end 

ध्यान दें कि निम्नलिखित सरल है और अभी भी काम करता है, हालांकि मुझे यकीन है कि नहीं कर रहा हूँ यह विश्वसनीय है:

@implementation MyAppDelegate (Testing) 

- (BOOL)application:(id)app didFinishLaunchingWithOptions:(id)opts { 
    return YES; 
} 

@end 

यह की श्रेणियों क्योंकि काम करता है गतिशील रूप से लोड किए गए घटकों (जैसे परीक्षण बंडल) में विधियां प्राथमिकता लेती हैं। हालांकि तेजस्वी लग रहा है।

+0

अपडेट करें मुझे वास्तव में यह कोड कहां रखना चाहिए? मेरे वर्तमान लक्ष्य में ऐपडिलेगेट नहीं है। और यदि मैं इसे अपने यूनिटटेस्ट लक्ष्य में जोड़ता हूं, तो यह कुछ भी नहीं बदलता है। (मैं एक्सकोड 4.6 का उपयोग कर रहा हूं) –

+0

आप इसे परीक्षण लक्ष्य में डालते हैं, और आप 'MyAppDelegate' का नाम बदलते हैं जो आपके ऐपडिलेगेट का क्लासनाम आपके मुख्य लक्ष्य में है। आपके परीक्षण लक्ष्य में ऐप प्रतिनिधि नहीं है, लेकिन यह इस सवाल का मुद्दा है, मुख्य लक्ष्य से ऐप प्रतिनिधि * अभी भी * निष्पादित है। – mxcl

+1

एक्सकोड 5 xcunit परीक्षणों में काम नहीं करता – user170317

5

अंतिम xcode संस्करण (5.0.2) में आप इसे बहुत आसान तरीके से कर सकते हैं। अपना टेस्ट लक्ष्य, "सामान्य" टैब चुनें। "लक्ष्य" फ़ील्ड में "कोई नहीं" सेट करें। फिर "चरण बनाएं" टैब पर टैप करें और "लक्ष्य निर्भरता" से अपना मुख्य लक्ष्य हटा दें।

+2

क्या आप वाकई पर्याप्त हैं? मैंने रिपोर्ट किए गए चरणों की कोशिश की है, लेकिन यह अभी भी सिम्युलेटर लॉन्च करता है। बहुत धन्यवाद –

+0

मैं इसे आज़माता हूं, लेकिन संकलन त्रुटि मिली है। – jolestar

+0

संकलन त्रुटियों को ठीक करने के लिए, सुनिश्चित करें कि सभी ढांचे को लिंक किया गया है कि आपके परीक्षण मामलों की आवश्यकता होती है (आमतौर पर आपके .app लिंक के समान होते हैं) और सुनिश्चित करें कि आपके बिल्ड चरण आपके स्रोत मामलों की सभी स्रोत फ़ाइलों को संकलित करते हैं। – mxcl

0

Xcode 7 और xctool का उपयोग

xctool सिम्युलेटर बिना इकाई परीक्षण को क्रियान्वित करने में सक्षम है।

इस काम कर पाने के लिए,

1। मेजबान ऐप के बिना चलने वाली लक्ष्य सेटिंग्स अपडेट करें।

अपनी प्रोजेक्ट का चयन करें -> फिर परीक्षण लक्ष्य -> ​​होस्ट एप्लिकेशन को किसी को भी सेट करें।

enter image description here

2. xctool स्थापित करें, यदि आप इसे ज़रूरत नहीं है।

brew install xctool 

3. भागो परीक्षण xctool साथ टर्मिनल का उपयोग कर।

xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator 
संबंधित मुद्दे