如何在特定条件下从Spec退出Protractor测试?

时间:2016-05-06 03:09:09

标签: jasmine protractor exit e2e-testing

我有一个包含多个规格的套件。每个规范都使用某些库上的代码,这些库在失败时返回被拒绝的承诺。

我很容易catch那些在我的规范中拒绝的承诺。我想知道的是,如果我可以让Protractor退出catch函数内的整个套件,因为同一套件中的下一个规格取决于之前规格的成功。

假设我有一个名为testEverything的套件,其中包含openAppsignIncheckUserlogout这些规格。如果openApp失败,则所有下一个规范都将因依赖而失败。

请考虑openApp的代码:

var myLib = require('./myLib.js');

describe('App', function() {

  it('should get opened', function(done) {

    myLib.openApp()
    .then(function() {

      console.log('Successfully opened app');

    })
    .catch(function(error) {

      console.log('Failed opening app');

      if ( error.critical ) {
        // Prevent next specs from running or simply quit test
      }

    })
    .finally(function() {

      done();

    });

  });

});

我将如何退出整个测试?

2 个答案:

答案 0 :(得分:2)

npm有一个名为protractor-fail-fast的模块。安装模块npm install protractor-fail-fast。以下是他们将此代码放入您的conf文件的网站示例:

var failFast = require('protractor-fail-fast');

exports.config = {
  plugins: [{
    package: 'protractor-fail-fast'
  }],

  onPrepare: function() {
    jasmine.getEnv().addReporter(failFast.init());
  },

  afterLaunch: function() {
    failFast.clean(); // Cleans up the "fail file" (see below) 
  }  
}

他们的网址是here

答案 1 :(得分:1)

我设法找到了解决方法。现在我使用的实际代码更复杂,但想法是一样的。

我在量角器的配置文件bail中添加了一个全局变量。请考虑配置文件顶部的以下代码:

(function () {

  global.bail = false;

})();

exports.config: { ...

上面的代码使用IIFE(立即调用的函数表达式),它在量角器的bail对象上定义global变量(在整个测试过程中都可用)。

我还为我需要的Jasmine匹配器编写了异步包装器,它将执行expect表达式,然后进行比较,并返回一个promise(使用Q模块)。例如:

var q = require('q');

function check(actual) {

    return {

      sameAs: function(expected) {

          var deferred = q.defer();
          var expectation = {};

          expect(actual).toBe(expected);

          expectation.result = (actual === expected);

          if ( expectation.result ) {

              deferred.resolve(expectation);
          }
          else {
              deferred.reject(expectation);
          }

          return deferred.promise;

      }

    };

}

module.exports = check;

然后在每个规范的最后,我根据规范的进度设置bail值,这将由这些异步匹配器的承诺决定。考虑以下作为第一个规范:

var check = require('myAsyncWrappers'); // Whatever the path is

describe('Test', function() {

    it('should bail on next spec if expectation fails', function(done) {

        var myValue = 123;

        check(myValue).sameAs('123')
        .then(function(expectation) {

            console.log('Expectation was met'); // Won't happen

        })
        .catch(function(expectation) {

            console.log('Expectation was not met'); // Will happen

            bail = true; // The global variable

        })
        .finally(function() {

            done();

        });

    });

});

最后,在下一个规范的开头,我检查bail并在必要时返回:

describe('Test', function() {

    it('should be skipped due to bail being true', function(done) {

        if ( bail ) {

            console.log('Skipping spec due to previous failure');

            done();

            return;

        }

        // The rest of spec

    });

});

现在我想提一下,那里有一个名为protractor-fail-fast的模块,只要期望失败,它就会在整个测试中保释。

但在我的情况下,我需要设置bail全局变量,具体取决于哪种类型的期望失败。我最终编写了一个库(非常小),将故障区分为关键和非关键,然后使用它,只有在发生严重故障时才会停止规范。