2015-12-16 16 views
14

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

पहले परीक्षण में झूठी नकारात्मकताएं हैं, क्योंकि लगातार स्क्रीनों में समान नौसेना बार लेबल हो सकते हैं (कोडबेस मैं चल रहा हूं मेरा नहीं है)। दूसरे परीक्षण में झूठी सकारात्मक विशेषताएं हैं, क्योंकि कभी-कभी तालिका तत्व पर क्लिक करने से किसी अन्य तालिका/स्क्रीन में संक्रमण नहीं होता है बल्कि इसके बजाय वर्तमान स्क्रीन में अतिरिक्त तत्व जोड़ते हैं।

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

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

आवेदन में:

- (void)viewDidAppear: (BOOL)animated { 

    [super viewDidAppear: animated]; 

    //... 

    UINavigationBar* navBar = self.navigationController.navigationBar; 
    if(navBar) 
    { 
     static NSInteger s_UID = 0; 
     navBar.topItem.accessibilityLabel = [NSString stringWithFormat:@"UID-%ld", s_UID++]; 
    } 
} 

XCTest यूआई परीक्षण में:

- (NSString*) navBarAccessibilityLabel: (XCUIApplication*) app 
{ 
    NSString* result = NULL; 

    XCUIElementQuery *navBars = app.navigationBars; 
    XCUIElement* firstElem = [navBars.staticTexts elementBoundByIndex:0]; 
    if(firstElem) 
    { 
     result = (NSString*)firstElem.accessibilityLabel; // This is always nil 
    } 

    return result; 
} 

नोट firstElem पाया जाता है, और है कि मैं जैसे निकालने में सक्षम हूँ कि firstElem.label इससे बहुत खुशी से।

किसी भी मदद की सराहना की।

+0

साथ एक महान लेख था यू किसी भी समाधान मिल मिल सकती है? @ कaitैन? –

उत्तर

0

मान लिया जाये कि आप अपना दृश्य नियंत्रकों दे दिया है उचित पहचानकर्ता (ताकि आप उन के बीच भेद कर सकते हैं), तो आप इस दृश्य शामिल नियंत्रकों को जोड़ सकते हैं: अपनी परियोजना के टेस्ट लक्ष्य में निर्माण सेटिंग के तहत वहाँ

#ifdef UITESTING 
- (void) viewDidAppear: animated 
{ 
    [super viewDidAppear: animated]; 
    // do your checking here 
} 
#endif 

, एक सेक्शन प्रोप्रोसेसर है। वहां आप प्रीप्रोसेसर मैक्रोज़ सेट कर सकते हैं। बस डीबग और/या रिलीज सेटिंग में 'UITESTING = 1' जोड़ें। प्रभाव यह है कि आपके परीक्षण निर्माण में UITESTING को परिभाषित किया जाएगा, इसलिए #ifdef UITESTING के तहत सभी कोड प्रीप्रोसेसर द्वारा शामिल किए जाएंगे।

+0

स्पष्टीकरण के लिए, क्या यह कोड यूआई परीक्षण कार्यक्रम में या मुख्य एप्लिकेशन कोड में जाएगा? – Kaitain

+0

परीक्षण का समर्थन करने के लिए यह आपके एप्लिकेशन कोड के अतिरिक्त होगा। मैं अनुमान लगा रहा हूं कि कुछ उचित #ifdef इसे आपके उत्पादन कोड से बाहर रख सकता है। –

+0

ठीक है ... मुझे लगता है कि मुझे कुछ याद आ रही है। "// यहां अपनी जांच करें" में जाने के लिए किस प्रकार का तर्क है? मैं एप्लिकेशन कोड में कुछ क्यों जांचूँगा? मैंने माना था कि एप्लिकेशन कोड को किसी प्रकार के पहचानकर्ता लेबल को किसी चीज़ पर लागू करने की आवश्यकता होगी, और यूआई टेस्ट कोड बाद में स्क्रीन परिवर्तन का पता लगाने के लिए लाभ उठाएगा। मैं इस समस्या को हल करने में प्रस्तावित प्रस्तावों की तुरंत उपयोग नहीं कर सकता (या स्क्रीन परिवर्तन का पता लगाने की अधिक सामान्य समस्या का समाधान करने में)। इस तर्क को उत्पादन कोड से बाहर रखना एक प्रमुख चिंता नहीं है। – Kaitain

5

अगर तत्वों से सुलभ हैं परीक्षण कर सकते हैं:

एक यूआई परीक्षण के अंदर वाम क्लिक करें और रिकॉर्डिंग शुरू, सिम्युलेटर शुरू कर देंगे और आप सिम्युलेटर के अंदर तत्व पर क्लिक कर सकते हैं, अगर तत्व सुलभ Xcode परीक्षण लिखेंगे है testExample विधि के अंदर आपके लिए कोड।

enter image description here

या सिम्युलेटर में अपनी एप्लिकेशन चलाने के लिए और सरल उपयोग निरीक्षक खोलें, और तत्व के रूप में विवरण इंस्पेक्टर में दिखाई देगा पर होवर करें।

enter image description here

इसके अलावा, मैं अपने मामले में लगता है कि आप यानी self.navigationItem.title = @"myScreen";

प्रत्येक स्क्रीन के लिए एक नेविगेशन आइटम शीर्षक जोड़कर इस की पुष्टि और फिर

// let app = XCUIApplication() // Swift 

UIApplication *app = [UIApplication alloc] init]; // Objective-C 

XCTAssertEqual(app.navigationBars.element.identifier, "myScreen") // Don't forget to import class XCTest 
यानी एक अभिकथन के साथ स्क्रीन सत्यापित कर सकता
+1

यह निश्चित रूप से उपयोगी है। धन्यवाद। हालांकि, जहां तक ​​मैं कह सकता हूं, यह वास्तविक दृश्य शीर्षक स्क्रीन पर बदल जाता है। मैं उम्मीद कर रहा था कि किसी तरह का किसी प्रकार का अदृश्य टैग जोड़ा जा सकता है जो अवलोकन योग्य मूल्यों को बिल्कुल म्यूट नहीं करेगा। (ठीक है, मुझे एहसास है कि आखिर में सभी पहुंच-योग्यता डेटा को SOME फॉर्म में देखा जा सकता है, भले ही यह ऑडियो हो।) – Kaitain

1

मैं Facebook's Snapshot test library का उपयोग करके स्नैपशॉट परीक्षण का उपयोग करूंगा।

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

आप और अधिक विस्तार here.

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