2012-11-12 14 views
12

मैं मोचा और WebDriverJS का उपयोग करके एक वेब एप्लिकेशन का परीक्षण कर रहा हूं, here के रूप में कम से कम। जब परीक्षण पास होते हैं, सब कुछ ठीक है। हालांकि, अगर एक परीक्षण विफल रहता है, तो सूट में शेष परीक्षण टाइमआउट होंगे और धावक वेबड्राइवर इंस्टेंस को बंद किए बिना सूट के अंत में बाहर निकल जाएगा। उदाहरण परीक्षण का मामला:Node.js + mocha + webdriverjs: असफल परीक्षण सुइट को मारने

var assert = require('assert'), 
    client = require("webdriverjs").remote({ 
     logLevel: 'silent' 
    }); 

describe('Self-test', function() { 

    before(function(done) { 
     client 
      .init() 
      .url('http://www.wikipedia.org/', function() { 
       done(); 
      }); 
    }); 

    after(function(done) { 
     client.end(function() { 
      done(); 
     }); 
    }); 

    // tests 

    it('should fail properly', function(done) { 
     client.getTitle(function(result) { 
      assert(false, 'This should fail'); 
      done(); 
     }); 
    }); 

    it('should pass afterwards', function(done) { 
     client.getTitle(function(result) { 
      assert(true, 'This should still pass'); 
      done(); 
     }); 
    }); 

}); 

उत्पादन:

~> mocha test/self-test.js 

    Self-test 
    1) should fail properly 
    2) should pass afterwards 
    3) "after all" hook 

✖ 3 of 2 tests failed: 

1) Self-test should fail properly: 
    AssertionError: This should fail 
    at null.<anonymous> (./test/self-test.js:24:17) 
    at QueueItem (./node_modules/webdriverjs/lib/webdriverjs.js:242:15) 
    at null.<anonymous> (./node_modules/webdriverjs/lib/commands/getTitle.js:12:6) 
    at QueueItem (./node_modules/webdriverjs/lib/webdriverjs.js:242:15) 
    at IncomingMessage.WebdriverJs.proxyResponse (./node_modules/webdriverjs/lib/webdriverjs.js:782:6) 
    at IncomingMessage.EventEmitter.emit (events.js:115:20) 
    at IncomingMessage._emitEnd (http.js:366:10) 
    at HTTPParser.parserOnMessageComplete [as onMessageComplete] (http.js:149:23) 
    at Socket.socketOnData [as ondata] (http.js:1366:20) 
    at TCP.onread (net.js:402:27) 

2) Self-test should pass afterwards: 
    Error: timeout of 10000ms exceeded 
    at Object.<anonymous> (./node_modules/mocha/lib/runnable.js:158:14) 
    at Timer.list.ontimeout (timers.js:101:19) 

3) Self-test "after all" hook: 
    Error: timeout of 10000ms exceeded 
    at Object.<anonymous> (./node_modules/mocha/lib/runnable.js:158:14) 
    at Timer.list.ontimeout (timers.js:101:19) 

जहां तक ​​मेरा बता सकते हैं, इस वजह से WebDriverJS कतार ठप हो जाता है जब एक परीक्षण विफल रहता है। क्या इसे ठीक करने का कोई तरीका है? यह स्थानीय कमांड लाइन परीक्षण के लिए भी उप-इष्टतम है, और यह पृष्ठभूमि को स्वचालित रूप से और/या पृष्ठभूमि में मुश्किल से असंभव बनाता है।

अद्यतन: मैं मैं हर परीक्षा के लिए एक नए ग्राहक instantiating द्वारा कतार विफलता ठीक कर सकते हैं लगता है, लेकिन यह बातें ज्यादा गति धीमी हो जाएगी (जैसा कि WebDriver उदाहरण खरोंच से हर बार शुरू करने की आवश्यकता होगी) और छोड़ना होगा परीक्षण विफलता पर अकुशल चारों ओर लटकने वाली वेबड्राइवर प्रक्रियाएं। आदर्श रूप से, मुझे Soda द्वारा प्रदान की गई संरचना की तरह कुछ चाहिए, जहां कतार में कहीं भी विफलता कतार के अंत तक जाती है और फिर परीक्षण ढांचे को पकड़ने के लिए त्रुटि फेंकता है।

उत्तर

2

आप सेटअप करना चाहिए और beforeEach() और afterEach() बजाय before() और after() साथ फाड़ यदि प्रत्येक परीक्षा WebDriverJS कतार के राज्य पर निर्भर है।

+0

इस दृष्टिकोण के साथ एकमात्र अंतर यह है कि परीक्षण पहले परीक्षण के बाद लटकता है, 'बाद में' पर समाप्त होता है, और दूसरा परीक्षण कभी नहीं चलता है। मुद्दा वही है। – nrabinowitz

+0

क्या होता है जब आप 'बाद()' का उपयोग नहीं करते हैं और इसके बजाय बस 'संलग्न करते हैं।प्रत्येक परीक्षण में 'क्लाइंट' ऑब्जेक्ट को कॉल करें() 'कॉल करें? आपने अनिवार्य रूप से दो एपीआई के बीच एसिंक नरक पर ठोकर खाई है, लेकिन इसे कुछ मामूली बदलावों के साथ ठीक किया जाना चाहिए। – srquinn

+0

इच्छा है कि मैं और अधिक मदद कर सकता हूं, लेकिन सेलेनियम सर्वर तक पहुंच के बिना मुझे चलाने के लिए परीक्षण नहीं मिल सकते हैं। – srquinn

2

जिस तरह से वेब टेड्रिवरज प्रत्येक टेस्ट लिखा जाता है, वह एक अलग सत्र होना चाहिए, और इसलिए init() के साथ शुरू होता है और अंत() के साथ समाप्त होता है। आपके परीक्षण में एक अपवाद mocha तक बुलबुला होगा और webdriverjs कतार गड़बड़ होगा। इसलिए आप हमें webdriverjs को ऐसे तरीके से करने का प्रयास कर रहे हैं जो समर्थित नहीं है।

सोडा के स्रोत कोड को देखते हुए यह भी मामला प्रतीत होता है। client.js:223 अपवादों को संभाला जाता है और त्रुटि कॉलबैक पर वापस भेज दी जाती है। यह कॉलबैक .end() के साथ फ़ंक्शन सेट है और इसलिए प्रत्येक टेस्ट के लिए .end() नहीं होने पर अंतिम परीक्षण के .end() कॉलबैक को कॉल किए जाने तक उसी सत्र के सभी परीक्षणों को छोड़ दिया जाएगा।

क्या यह कतार में कहीं भी विफलता कतार के अंत तक छोड़ने का मतलब है? यदि यह वही व्यवहार है जिसे आप चाहते हैं, तो आपको webdriver.js:244 को पकड़ने की कोशिश के साथ संलग्न करना होगा और जब कोई अपवाद पकड़ा जाएगा, तो .end() कमांड को कॉल करें।

+0

अलग-अलग सत्रों में कोई विशेष कारण परीक्षण होने की आवश्यकता नहीं है, और यदि परीक्षणों को आप लिखते हैं तो यह परीक्षण बहुत अधिक धीमा हो जाता है (उदाहरण के लिए यदि आपके ऐप को प्रमाणीकरण की आवश्यकता है, तो आपको प्रत्येक परीक्षण के लिए लॉग इन करने की आवश्यकता है)। यहां तक ​​कि यदि आपने इस दृष्टिकोण का पालन किया है, तो एक चरण विफल होने के बाद '.end()' को वर्तमान परीक्षण के लिए कभी भी नहीं बुलाया जाएगा, इसलिए आपको अभी भी अनजान वेबड्राइवर उदाहरणों की समस्या होगी। – nrabinowitz

+0

'कोशिश/पकड़' के साथ रैपिंग लाइन 244 काम करेगी, लेकिन मुझे "फिर कॉल करें" .end() '" विकल्प पसंद नहीं है, क्योंकि यह एक खुले क्लाइंट पर भरोसा करने वाले और परीक्षणों को मार देगा, और फेंक नहीं देगा त्रुटि (हालांकि मुझे लगता है कि आप '.end() ') को कॉल करने के बाद पूरी तरह से फेंक सकते हैं। – nrabinowitz

+0

इसके अलावा, कॉलिंग .end() मैन्युअल रूप से यहां काम नहीं करेगा - जो इसे कतार में जोड़ देगा, जो शायद और नहीं चल रहा है। मुझे लगता है कि मुझे एपीआई कमांड को सीधे कॉल करना होगा। – nrabinowitz

0

आप एक listner की आवश्यकता होगी न आया हुआ अपवाद

webdriver.promise.controlFlow().on('uncaughtException', function(e) { 
    console.error('Unhandled error: ' + e); 
    driver.quit(); 
}); 

इस पकड़ने के लिए है मैं क्या कर रहा हूँ इसके साथ एकमात्र मुद्दा यह भी दावा त्रुटि पकड़ता है। उम्मीद है कि यह मदद करता है।

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