2012-11-12 21 views
12

Mocha ve WebDriverJS kullanarak bir web uygulamasını test ediyorum, here. Testler geçince, her şey yolunda. Ancak, bir test başarısız olursa, paketdeki diğer testler zaman aşımına uğrayacak ve Runner, webdriver örneğini kapatmadan paketin sonunda çıkacaktır. Örnek test durumu:Node.js + mocha + webdriverjs: Başarısız olan testler Suite

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(); 
     }); 
    }); 

}); 

çıkışı:

bir test başarısız olduğunda WebDriverJS kuyruk durdu olur çünkü
~> 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) 

Bildiğim kadarıyla söyleyebilirim, bu. Bunu düzeltmenin bir yolu var mı? Yerel komut satırı testi için bile en uygun alt yapıdır ve koşu testlerini otomatik olarak ve/veya arka planda imkansız hale getirmeyi zorlaştırır.

Güncelleme: ben her test için yeni bir müşteri nesnelleştirilmesiyle kuyruk yetmezliği düzeltebilirsiniz düşünüyorum, ama bu (WebDriver örneği sıfırdan her zaman başlatmak gerekir gibi) çok daha yavaş işler yapacak ve bırakacaktı WebDriver süreçleri test arızasında takılı kalmadan çalışır. İdeal olarak, kuyruğun herhangi bir yerinde bir sıranın kuyruğun sonuna kadar atladığı ve daha sonra test çerçevesinin yakalanması için hata attığı Soda tarafından sunulan yapı gibi bir şey isterim.

cevap

2

Sen kurulum gerektiği ve her test WebDriverJS kuyruğunun durumuna bağlıdır eğer beforeEach() ve afterEach() yerine before() ve after() ile yıkmak.

+0

Bu yaklaşımdaki tek fark, testin ilk testten sonra, "afterEach" üzerinde zaman aşımına uğraması ve ikinci testin hiçbir zaman çalışmamasıdır. Sorun aynı. – nrabinowitz

+0

'after()' işlevini kullanmıyorsanız ve bunun yerine 'sadece ekleyin.Her testte "client" nesnesine end() 'diyoruz? Esasen iki API arasındaki uyumsuzluğa düştünüz, ancak bazı küçük ince ayarlarla düzeltilebilir olmalı. – srquinn

+0

Keşke daha fazla yardımcı olabilirdim, ancak Selenium sunucusuna erişemediğim için test yapamıyorum. – srquinn

2

Webdriverjs yazılan yolun her bir testi ayrı bir oturum olmalı ve bu nedenle init() ile başlayıp son() ile bitmelidir. Testinizdeki bir istisna, mocha'ya kadar kabarcık oluşturacak ve webdriverjs kuyruğunu dağıtacaktır. Bu nedenle, bize desteklenmeyen bir şekilde webdriverjs deniyorsunuz.

Soda kaynak koduna baktığımızda da durum böyle görünüyor. client.js:223 istisnaları işlenir ve hata geri çağrıya iletilir. Bu geri arama, .end() ile ayarlanan işlevdir ve bu nedenle her bir test için bir .end() değeri, son testin .end() geri çağrısını çağırana kadar aynı oturumun tüm aşağıdaki testlerini atlayacaktır.

Bu, "kuyruktaki herhangi bir yerdeki bir hata, sıranın sonuna kadar gider" ile kastedilen şey bu mu? İstediğiniz davranış bu ise, bir deneyin yakalama ile webdriver.js:244 kapağını kapatmanız gerekir ve bir özel durum yakalandığında, .end() komutunu çağırın.

+0

Testlerin farklı oturumlarda olması için belirli bir sebep yoktur ve testleri bu şekilde yazarsanız çok daha yavaş çalışır, (örneğin, uygulamanızın kimlik doğrulama gerektiriyorsa, her test için giriş yapmanız gerekir). Bu yaklaşımı uygulamış olsanız bile, .end() 'bir adım başarısız olduğunda mevcut test için hiçbir zaman çağrılmayacaktı, bu yüzden hala kapatılmamış WebDriver örnekleri sorununa sahip olursunuz. – nrabinowitz

+0

"try/catch" ile satır 244 sarma çalışır, ama ben "açık" bir istemci üzerinde güveniyor ve daha fazla sınamaları öldürecek gibi, ".end()" seçeneği çağırma gibi değil hata (Ben kesinlikle .end() ') çağırdıktan sonra mükemmel atabilir varsayalım. – nrabinowitz

+0

Ayrıca, .end() el ile arama burada çalışmayacak - bu, yalnızca daha fazla koşmuyor olan sıraya ekleyecektir. Doğrudan API komutunu çağırmalıyım sanırım. – nrabinowitz

1

Selenyum Eğer yakalanmamış istisna

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

bu yakalamak için bir Listner gerekir https://npmjs.org/package/selenium-webdriver

İlgili konular