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

How to exit Protractor test from Spec on specific condition?

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

我可以轻松地 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();

    });

  });

});

如何退出整个测试?

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

他们的url是here

我想出了一个解决方法。现在我使用的实际代码要复杂得多,但思路是一样的。

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

(function () {

  global.bail = false;

})();

exports.config: { ...

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

我还为我需要的 Jasmine 匹配器编写了异步包装器,它将执行一个 expect 表达式,然后进行比较,然后 return 一个承诺(使用 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 和 return(如有必要):

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 全局变量。我最终编写了一个库(非常小),它将故障区分为关键故障和非关键故障,然后使用它,只有在发生严重故障时才会停止规范。