2015-12-02 4 views
4

Вопрос:Очистка транспортир трассировки стека

Можно ли очистить трассировки стека и оставить только соответствующие кадры, устраняя все Protractor, WebDriverJS и Jasmine конкретные?

История:

Давайте выполним этот пример испытания:

describe("SO test", function() { 
    beforeEach(function() { 
     browser.get("https://angularjs.org"); 
    }); 

    it("should throw a meaningful error", function() { 
     element(by.id("not_found")).click(); 
    }); 
}); 

Он потерпит неудачу со следующим StackTrace:

SO test should throw a meaningful error 
    - Failed: No element found using locator: By.id("not_found") 
     at new bot.Error (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/atoms/error.js:108:18) 
     at /usr/local/lib/node_modules/protractor/lib/element.js:676:15 
     at [object Object].promise.Promise.goog.defineClass.invokeCallback_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:1337:14) 
     at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_.execute_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2776:14) 
     at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2758:21) 
     at goog.async.run.processWorkQueue (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/async/run.js:124:15) 
     at process._tickCallback (node.js:377:9) 
    Error 
     at [object Object].ElementArrayFinder.applyAction_ (/usr/local/lib/node_modules/protractor/lib/element.js:382:21) 
     at [object Object].ElementArrayFinder.(anonymous function) [as click] (/usr/local/lib/node_modules/protractor/lib/element.js:78:17) 
     at [object Object].ElementFinder.(anonymous function) [as click] (/usr/local/lib/node_modules/protractor/lib/element.js:711:7) 
     at Object.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:9:37) 
     at /usr/local/lib/node_modules/protractor/node_modules/jasminewd2/index.js:96:23 
     at [object Object].promise.Promise.goog.defineClass.constructor (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:1056:7) 
     at new wrappedCtr (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/base.js:2468:26) 
     at controlFlowExecute (/usr/local/lib/node_modules/protractor/node_modules/jasminewd2/index.js:82:18) 
     at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_.execute_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2776:14) 
     at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2758:21) 
    From: Task: Run it("should throw a meaningful error") in control flow 
     at Object.<anonymous> (/usr/local/lib/node_modules/protractor/node_modules/jasminewd2/index.js:81:14) 
     at /usr/local/lib/node_modules/protractor/node_modules/jasminewd2/index.js:18:5 
     at [object Object].promise.Promise.goog.defineClass.invokeCallback_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:1337:14) 
     at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_.execute_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2776:14) 
     at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2758:21) 
     at goog.async.run.processWorkQueue (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/async/run.js:124:15) 
    From asynchronous test: 
    Error 
     at Suite.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:8:5) 
     at Object.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:3:1) 
     at Module._compile (module.js:425:26) 
     at Object.Module._extensions..js (module.js:432:10) 
     at Module.load (module.js:356:32) 

Как вы можете видеть, это не так просто найти на какой строке в тесте ошибку действительно произошло. Он скрыт где-то внутри трассировки стека, покрытой Protractor, WebDriverJS и Jasmine кадрами стека. Это затрудняет отладку и разработку сквозных тестов.

Желаемый выход:

SO test should throw a meaningful error 
    - Failed: No element found using locator: By.id("not_found") 
     at Object.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:9:37) 
    From asynchronous test: 
    Error 
     at Suite.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:8:5) 
     at Object.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:3:1) 
     at Module._compile (module.js:425:26) 
     at Object.Module._extensions..js (module.js:432:10) 
     at Module.load (module.js:356:32) 
     at Function.Module._load (module.js:311:12) 

Использование protractor 3.0.0 и jasmine2.


В mocha мире есть соответствующий mocha-clean пакет, который отфильтровывает все приходя внутри node_modules и mocha сам оставляя чистый трассировки стека, который легко читать.

+1

Вы используете пользовательских репортеров? У меня есть более чистый результат для того же теста. –

+0

@ MichaelRadionov просто пробовал отдельно с конфигурацией по умолчанию без репортеров - да, результат отличается и более чистым (хотя он по-прежнему содержит специальные рамки selenium и jasmine). Вы были правы, выглядели как '' jasmine-spec-reporter' '(https://github.com/bcaudan/jasmine-spec-reporter/blob/master/docs/protractor-configuration.md) сделали stacktrace хуже. Пожалуйста, отправьте ответ, и я соглашусь с этим. Благодаря! – alecxe

+0

@ MichaelRadionov btw, отвлекаясь от проблемы, связанной с проблемой jasmine-spec-reporter, вы думаете, что мы можем очистить трассировку стека еще больше, устраняя все узлы_модулей и jasmine-core? Таким образом, он будет выглядеть примерно так, как показано в разделе «Желаемый результат»? Благодарю. – alecxe

ответ

3

Как оказалось, если вы используете каких-либо пользовательских репортеров, они могут ввести новое поведение в управление выводом трассировки стека. Транспортир сам скрывает почти все, поэтому вы не увидите никаких записей журнала от node_modules или Jasmine.

Как вы используете jasmine-spec-reporter, который предоставляет возможность управления трассировкой стека, может быть, вы установили некоторый подробный режим в параметрах. В docs for Protractor по какой-то причине предлагается использовать режим all, который в основном отображает трассировку стека enitre.

onPrepare: function() { 
    jasmine.getEnv().addReporter(new SpecReporter({ 
     spec: { 
     displayStacktrace: true 
     } 
    })); 

Если вы просто измените параметр displayStacktrace от all до none, вы должны получить чистые результаты без каких-либо следов стеки. Есть также варианты summary и specs.Вы не могли бы заметить разницу между ними в вашем примере, но если добавить еще несколько спецификаций в вашей ванной, то вы сможете увидеть разницу:

  1. specs - если спецификация терпит неудачу в процессе при выполнении тестов вы увидите трассировку стека сразу после сообщения о сбое спецификации
  2. summary - если в процессе выполнения тестов не работает, то вы получите , а не, следите за трассировкой стека сразу после отказа спецификации сообщение, но вы получите список всех трасс стека для неудачных спецификаций в конце всех тестов.
  3. all - объединяет specs и summary - если в процессе выполнения тестов не получается, вы увидите трассировку стека сразу после сообщения об ошибке spec и вы получите список всех трасс стека для неудачных спецификаций в конце всего тесты
  4. none - трассировки стека не будет отображаться в любом месте
1

jasmine-spec-reporter «s API изменился.

new example иллюстрирует простой вариант, чтобы отключить трассировку стека:

let SpecReporter = require('jasmine-spec-reporter').SpecReporter; 

exports.config = { 
    framework: 'jasmine', 
    // Your config here... 

    jasmineNodeOpts: { 
    print: function() {} 
    }, 

    onPrepare: function() { 
     jasmine.getEnv().addReporter(
      new SpecReporter({ 
       spec: { 
        displayStacktrace: true 
       } 
      }) 
     ); 
    } 
} 
0

Для тех, кто ищет стабильный и удобный способ, чтобы отфильтровать транспортир StackTrace, есть еще один вариант - protractor-beautiful-reporter, который будет генерировать очень информативный HTML-отчет, который также может отфильтровать stacktrace, фокусируясь только на соответствующих частях (функция «умная трассировка стека»).

0

вы можете установить уровень ведения webdriver путем прохождения параметра -logging. Например, в package.json, чтобы он выглядел как этот

"start": "node node_modules/protractor/bin/webdriver-manager start --logging=logging.conf" 

создать файл logging.conf и поместите его в корневой папке проекта

и в этом файле поместить

уровень = ПРЕДУПРЕЖДЕНИЕ

Смежные вопросы