Testuję aplikację internetową przy użyciu Mocha i WebDriverJS, mniej więcej tak jak opisano w artykule here. Kiedy testy mijają, wszystko jest w porządku. Jeśli jednak jeden test się nie powiedzie, pozostałe testy w pakiecie przekroczą limit czasu, a biegacz zakończy pracę po zakończeniu zestawu, bez zamykania instancji Webdriver. Przykład testowy przypadek:Node.js + mocha + webdriverjs: testy zakończone niepowodzeniem zabezpieczyły pakiet
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();
});
});
});
wyjściowa:
~> 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)
O ile mogę powiedzieć, to dlatego, że kolejka WebDriverJS zostaje wstrzymane, gdy próba nie powiedzie się. Czy istnieje sposób, aby to naprawić? To nie jest optymalne nawet dla lokalnych testów linii poleceń, i sprawia, że testowanie automatyczne i/lub w tle jest trudne do niemożliwego.
Aktualizacja: myślę, że mogę naprawić awarię kolejka o uruchamianiu nowego klienta dla każdego testu, ale byłoby to zrobić rzeczy znacznie wolniej (jako instancja WebDriver musiałaby rozpocząć się od nowa za każdym razem) i zostawi Procesy WebDriver zawieszają się wokół nierozliczonych w przypadku niepowodzenia testu. Idealnie, chciałbym coś podobnego do struktury oferowanej przez Soda, gdzie awaria gdzieś w kolejce przeskakuje na koniec kolejki, a następnie zgłasza błąd dla szkieletu testowego do przechwycenia.
Jedyna różnica w tym podejściu polega na tym, że test zawiesza się po pierwszym teście, limit czasu na "afterEach", a drugi test nigdy nie działa. Problem jest taki sam. – nrabinowitz
Co się stanie, gdy nie użyjesz 'po()' i zamiast tego po prostu dodasz '.end() 'wywołanie obiektu' client' w każdym teście? Zasadniczo natknąłeś się na asynchroniczne piekło pomiędzy dwoma interfejsami API, ale powinno być możliwe do poprawienia dzięki drobnym poprawkom. – srquinn
Chciałbym pomóc, ale bez dostępu do serwera Selenium nie mogę uruchomić testów. – srquinn