2015-10-21 23 views
13

के साथ मॉकिंग ऑब्जेक्ट्स IOS UI Automation के लिए अब तक KIF Framework का उपयोग कर रहा था। केआईएफ (यूनिट टेस्ट) लक्ष्य उसी प्रक्रिया में यूनिट/यूआई परीक्षण कोड चलाते हैं जैसे आपका एप्लिकेशन चल रहा है और हम नकली डेटा दिखाने के लिए ऐप द्वारा उपयोग की जाने वाली विभिन्न ऑब्जेक्ट्स/कक्षाओं को आसानी से मॉक कर सकते हैं।एक्सकोड 7 यूआई ऑटोमेशन

एक्सकोड 7 आधारित नए यूआई ऑटोमेशन पर स्विच करते समय, मैंने पाया कि यूआई यूनिट टेस्ट लक्ष्य अलग प्रक्रिया में चलता है और यह एप्लिकेशन को अलग प्रक्रिया में लॉन्च करता है। और इस प्रकार यूनिट परीक्षणों के माध्यम से ऐप कक्षाओं/वस्तुओं तक पहुंचना और उन्हें नकल करना संभव नहीं है।

क्या किसी को भी एक ही समस्या का सामना करना पड़ा, और किसी भी कामकाज के बारे में पता था?

यदि कोई और विवरण आवश्यक है तो कृपया मुझे बताएं।

उत्तर: कृपया नीचे दिया गया विस्तृत उत्तर देखें। इसके अलावा यहां एप्पल devs से जवाब देने के लिए कड़ी है: https://forums.developer.apple.com/thread/23552

उत्तर

10

क्योंकि आप एक अलग प्रक्रिया में चल रहे हैं, वहाँ isn Xcode पर बहुत अच्छी तरह से काम करता है अपने परीक्षणों के माध्यम से अपने आवेदन में नकली इंजेक्षन करने का वास्तव में एक तरीका नहीं है। ऐसा कहकर, आप अपनी ऐप की प्रक्रिया को नियंत्रित कर सकते हैं, और इस पर इसके कुछ प्रभाव हो सकते हैं।

मैं इस बारे में महसूस करता हूं कि मैं इस बारे में कैसा महसूस करता हूं (मैं वर्तमान में अनिश्चित हूं), लेकिन आप अपने ऐप में कुछ कोड जोड़ सकते हैं जो पर्यावरण चर (NSProcessInfo के माध्यम से) पढ़ता है जो ऐप को अलग तरीके से व्यवहार करता है (यानी, अपनी निर्भरता इंजेक्शन आपकी कक्षा में इंजेक्शन दे रहा है, तो यह बदलें कि यह मैक्स का उपयोग करता है)।

इसका नकारात्मक पक्ष यह है कि नकली कोड परीक्षण बंडल में सख्ती से निहित नहीं है, और आप अपने ऐप में उस कोड के साथ समाप्त होते हैं (जब तक कि आप इसे अलग करने के लिए #if कथन का उपयोग न करें)। जाहिर है, यह भी आपके कोड ब्रांचिंग के साथ समझदार होना महत्वपूर्ण है, इसलिए आप अपने परीक्षण को अमान्य नहीं करते हैं।

let app = XCUIApplication() 
app.launchEnvironment = ["UITestUseMocks" : "true"] 
app.launch() 

फिर अपने आवेदन में आपको लगता है कि के लिए, संभवतः एक #if बयान में जाँच करें और अपनी व्यवहार में परिवर्तन कर सकते हैं::

आप सेटअप एक पर्यावरण चर पहले अपने यूआई परीक्षण में एप्लिकेशन को लॉन्च करने के लिए कर सकता है

#if TEST_TARGET 
    if let useMocks = NSProcessInfo().environment["UITestUseMocks"] where useMocks == "true" { 
     // Alter services used in dependency injection or some other testing behavior 
    } 
#endif 

मैं एक नकली सेवा परत को लागू करने के लिए इस दृष्टिकोण पर विचार कर रहा हूं जो कि कुछ डिब्बाबंद सर्वर प्रतिक्रियाओं को दोहराता है ताकि मैं अपने यूआई परीक्षण सर्वर प्रतिक्रियाओं पर निर्भर न हो (अन्य चीजें सर्वर का परीक्षण करें)।

+1

ओह वाह! यह पूरे निर्भरता इंजेक्शन विचार को तोड़ देता है। मैं निश्चित रूप से अपने उत्पादन कोड में परीक्षण कोड शुरू नहीं करना चाहता हूं। यह वास्तव में एक शोस्टॉपर है। – user1366265

+0

@ user1366265 मैं सहमत हूं, यद्यपि आपने संकलक निर्देशों में सबकुछ लपेट लिया है, मैंने ऊपर उल्लेख किया है कि आप तकनीकी रूप से ऐसे उत्पादन को अपने उत्पादन बाइनरी में पेश नहीं करेंगे (मान लें कि आपके कंपाइलर झंडे सही तरीके से सेटअप हैं)। ऐसा कहकर, यह स्पष्ट रूप से आदर्श नहीं है और गलत पाने में आसान है। –

-3

मैं आईओएस में मजाक के लिए कि पुस्तकालय का उपयोग कर रहा है और 7. http://ocmock.org/ios/

+2

यह उत्तर डाउन-वोट किया जा रहा है क्योंकि जब भी आप एक्ससीटीएस के साथ ओसीएमॉक का उपयोग कर सकते हैं, तो यह एक्ससीटीईएस + एक्ससीयूआई के साथ काम नहीं करेगा क्योंकि सभी एक्ससीयूआई ऑपरेशंस रिमोट प्रोसेस के साथ बातचीत करते हैं, इसलिए आप स्थानीय स्तर पर रनटाइम कक्षाओं में मजाक कर रहे हैं किसी भी XCUI कमांड के पिछले रिमोट ऐप प्रक्रिया पर कोई प्रभाव नहीं पड़ता क्योंकि दोनों प्रक्रियाओं में अलग-अलग रनटाइम उदाहरण होते हैं। – bithavoc

+0

@ बिथवोक, यह वही है जो मैंने अनुभव किया था। – user1366265

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