7

से जावास्क्रिप्ट में एक सिंक्रोनस HTTP GET अनुरोध या शेल स्क्रिप्ट का आह्वान करना IOS एक आईओएस अनुप्रयोग के लिए यूनिट परीक्षण लिखने के लिए ऐप्पल के UIAutomation का उपयोग करने का प्रयास कर रहा है जिसमें सर्वर-साइड घटक है। विभिन्न राज्यों में परीक्षण सर्वर स्थापित करने के लिए (साथ ही साथ मेरे सर्वर के माध्यम से संचार करने वाले दो क्लाइंट अनुकरण), मैं अपने जावास्क्रिप्ट-आधारित परीक्षण के भीतर HTTP प्राप्त अनुरोध जारी करना चाहता हूं।आईओएस UIAutomation

क्या कोई भी यूआईयूटॉमेशन जावास्क्रिप्ट परीक्षणों के भीतर सीधे HTTP GET अनुरोधों को जारी करने का तरीका प्रदान कर सकता है, या मेरे UIAutomation जावास्क्रिप्ट परीक्षणों से एक शेल स्क्रिप्ट कैसे शुरू किया जाए?

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

धन्यवाद!

उत्तर

5

लोग,

मैं संसाधित करने और एक UIAlertView में परिणाम देने के आईओएस ग्राहक के लिए HTTP अनुरोध भेज कर इस को हल करने के लिए कर रहा था। ध्यान दें कि सभी आईओएस कोड संशोधन #if DEBUG सशर्त संकलन निर्देशों में लिपटे हैं।

सबसे पहले, अपने ग्राहक को डिवाइस शेक की स्थिति में अधिसूचनाएं भेजने के लिए सेट करें। Read this post for more information

इसके बाद, अपने आईओएस मुख्य अनुप्रयोग प्रतिनिधि में इस कोड जोड़ें:

- (void) deviceShakenShowDebug:(id)sender 
{ 
    if (!self.textFieldEnterDebugArgs) 
    { 
     self.textFieldEnterDebugArgs = [[[UITextField alloc] initWithFrame:CGRectMake(0, 0, 260.0, 25.0)] autorelease]; 
     self.textFieldEnterDebugArgs.accessibilityLabel = @"AlertDebugArgsField"; 
     self.textFieldEnterDebugArgs.isAccessibilityElement = YES; 
     [self.textFieldEnterDebugArgs setBackgroundColor:[UIColor whiteColor]]; 
     [self.tabBarController.selectedViewController.view addSubview:self.textFieldEnterDebugArgs]; 
     [self.tabBarController.selectedViewController.view bringSubviewToFront:self.textFieldEnterDebugArgs]; 
    } 
    else 
    { 
     if ([self.textFieldEnterDebugArgs.text length] > 0) 
     { 
      if ([self.textFieldEnterDebugArgs.text hasPrefix:@"http://"]) 
      { 
       [self doDebugHttpRequest:self.textFieldEnterDebugArgs.text];  
      } 
     } 
    } 
} 

- (void)requestDidFinishLoad:(TTURLRequest*)request 
{ 
     NSString *response = [[[NSString alloc] initWithData:((TTURLDataResponse*)request.response).data 
                encoding:NSUTF8StringEncoding] autorelease]; 

     UIAlertView *resultAlert = 
      [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Request Loaded",@"") 
             message:response 
             delegate:nil 
          cancelButtonTitle:NSLocalizedString(@"OK",@"") 
          otherButtonTitles:nil] autorelease]; 
     resultAlert.accessibilityLabel = @"AlertDebugResult"; 
     [resultAlert show]; 
} 

इस कोड को बहुत शीर्ष करने के लिए एक UITextField जोड़ देगा:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(deviceShakenShowDebug:) 
              name:@"DeviceShaken" 
              object:nil]; 

फिर एक विधि है कि कुछ इस तरह दिखता जोड़ने किसी भी नेविगेशन बार या अन्य UI तत्व के ठीक ऊपर थप्पड़ मारने के बाद नियंत्रक को देखें। UIAutomation, या आप उपयोगकर्ता, मैन्युअल रूप से इस UITextField में एक यूआरएल दर्ज कर सकते हैं। जब आप डिवाइस को फिर से हिलाते हैं, यदि पाठ "http" से शुरू होता है तो यह कोड में HTTP अनुरोध जारी करेगा (पाठक को doDebugHttpRequest को लागू करने के लिए व्यायाम)।

फिर, मेरी UIAutomation JavaScript फ़ाइल में, मैं निम्नलिखित दो कार्यों को परिभाषित किया है: मेरे जावास्क्रिप्ट फ़ाइल में

function httpGet(url, delayInSec) { 
    if (!delayInSec) delay = 1; 
    var alertDebugResultSeen = false; 
    var httpResponseValue = null; 

    UIATarget.onAlert = function onAlert(alert) {  
    httpResponseValue = alert.staticTexts().toArray()[1].name(); 
    alert.buttons()[0].tap(); 
    alertDebugResultSeen = true; 
    } 

    var target = UIATarget.localTarget(); 
    var application = target.frontMostApp(); 
    target.shake(); // bring up the input field 
    application.mainWindow().textFields()["AlertDebugArgsField"].setValue(url); 
    target.shake(); // send back to be processed 
    target.delay(delayInSec); 
    assertTrue(alertDebugResultSeen); 
    return httpResponseValue; 
} 

function httpGetJSON(url, delayInSec) { 
    var response = httpGet(url, delayInSec); 
    return eval('(' + response + ')'); 
} 

अब, मैं

httpGet('http://localhost:3000/do_something') 

कॉल कर सकते हैं और यह निष्पादित करेंगे एक HTTP निवेदन। मैं JSON डेटा सर्वर से वापस चाहते हैं, मैं

var jsonResponse = httpGetJSON('http://localhost:3000/do_something') 

को कॉल करते हैं मैं जानता हूँ कि यह एक लंबे समय से चल कॉल होने जा रहा है, मैं फोन

var jsonResponse = httpGetJSON('http://localhost:3000/do_something', 10 /* timeout */) 

मैं सफलतापूर्वक इस दृष्टिकोण का उपयोग किया गया है अब कई हफ्तों के लिए।

+0

काफी बदसूरत हैक की तरह दिखता है: गैर मान्यता प्राप्त चयनकर्ता उदाहरण

यहाँ एक पूरी तरह से काम कर रहे उदाहरण है कि google.com हिट और सभी उत्पादन लॉग है करने के लिए भेजा। लेकिन यह काम करना चाहिए :)। लेकिन मैं उपकरण ढूंढ रहा हूं जो आईओएस कोड को बदले बिना ऐसा करने की अनुमति देता है ... –

+0

यदि आपको कोई मिलता है, तो मैं सभी कान हूं। Http://corner.squareup.com/2011/07/ios-integration-testing.html भी है लेकिन यह स्पष्ट रूप से अनियंत्रित एपीआई का उपयोग करता है। यह बहुत बुरा है ऐप्पल का समाधान इतना कठिन बेकार है। – esilver

2

+1 "शेक()" के रचनात्मक उपयोग के लिए +1। हालांकि, यह कुछ परियोजनाओं के लिए एक विकल्प नहीं है, खासकर वे जो वास्तव में शेक सुविधा का उपयोग करते हैं।

बॉक्स के बाहर सोचें। कुछ और के साथ लाने (पायथन, रूबी, node.js, bash + wget, आदि)। फिर, आप प्री-डिब्बाबंद प्रतिक्रिया का उपयोग कर सकते हैं और यूई-टेस्ट को स्वतः उत्पन्न कर सकते हैं।परीक्षण में "नमूना डेटा" के रूप में गतिशील रूप से जेनरेट जेसन पेलोड सहित फ्लाई पर जेएस। फिर आप बस परीक्षण निष्पादित करते हैं।

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

2

ऐप्पल ने हाल ही में UIAutomation को तत्व performing a task के लिए एक नया तत्व शामिल करने के लिए अद्यतन किया है जो परीक्षण निष्पादित करने वाले उपकरण का उदाहरण चला रहा है।

3

बस एक छोटा सा सुधार की कोशिश करो। उत्तर जो UIATarget.host() का उपयोग करने का सुझाव देता है। PerformTaskWithPathArgumentsTimeout आईओएस 5.0+ में यूआरएल पर अनुरोध करने का एक आसान तरीका है, लेकिन उदाहरण का वाक्यविन्यास गलत है। यहाँ इस कॉल करने के लिए सही तरीका है:

UIATarget.host().performTaskWithPathArgumentsTimeout("/usr/bin/curl", ["http://google.com"], 30); 

"[" चारों ओर "आर्ग" परम महत्वपूर्ण है, और परीक्षण निम्न के समान एक अपवाद के साथ मर जाएगा अगर आप कोष्ठक भूल:

त्रुटि: - [__ NSCFString गिनती]:

var result = UIATarget.host().performTaskWithPathArgumentsTimeout("/usr/bin/curl", ["http://www.google.com"], 30); 

UIALogger.logDebug("exitCode: " + result.exitCode); 

UIALogger.logDebug("stdout: " + result.stdout); 

UIALogger.logDebug("stderr: " + result.stderr); 
संबंधित मुद्दे