Подтвердить что ты не робот

Node.js + mocha + webdriverjs: неудачные тесты kill suite

Я тестирую веб-приложение с использованием Mocha и WebDriverJS, более или менее описываемое . Когда тесты проходят, все в порядке. Однако, если один тест не удался, остальные тесты в пакете будут таймаутом, а бегун выйдет в конце набора, не закрывая экземпляр Webdriver. Пример тестового примера:

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 задерживается, когда тест терпит неудачу. Есть ли способ исправить это?. Он не оптимален даже для локального тестирования командной строки, и он автоматически запускает тесты и/или в фоновом режиме труднодоступными.

Обновление: Я думаю, что могу исправить ошибку очереди, создав новый клиент для каждого теста, но это сделает вещи намного медленнее (поскольку экземпляр WebDriver должен запускаться с нуля каждый раз ) и оставит процессы WebDriver, зависающие от неквалифицированных при неудаче теста. В идеале мне бы хотелось что-то вроде структуры, предлагаемой Soda, где сбой где-то в очереди пропускается до конца очереди и затем выдает ошибку для проверки рамки проверки.

4b9b3361

Ответ 1

Вы должны установить и снести с помощью beforeEach() и afterEach() вместо before() и after(), если каждый тест зависит от состояния очереди WebDriverJS.

Ответ 2

Как записывается webdriverjs, каждый тест должен быть отдельным сеансом, и поэтому начинаться с init() и заканчиваться на end(). Исключение в вашем тесте будет пузыриться до мокко и испортить очередь webdriverjs. Поэтому вы пытаетесь использовать webdriverjs таким образом, который не поддерживается.

Глядя на исходный код соды, это также выглядит так. В client.js: 223 обрабатываются исключения, и ошибка возвращается к обратному вызову. Этот обратный вызов представляет собой набор функций с . End() и, следовательно, не имеет .end() для каждого теста, просто пропустит все следующие тесты в тот же сеанс до вызова последнего тестового вызова .end().

Это то, что вы подразумеваете под "сбой где-то в очереди переходит в конец очереди"? Если это поведение, которое вы хотите, вам придется заключить webdriver.js: 244 с попыткой catch и когда поймано исключение, вызовите . end() команда.

Ответ 4

вам понадобится listner, чтобы поймать неперехваченное исключение

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

это то, что я делаю. Единственная проблема с этим - это также ловить ошибку утверждения. надеюсь, что это поможет.