【问题标题】:How to exit Protractor test from Spec on specific condition?如何在特定条件下从 Spec 退出量角器测试?
【发布时间】:2016-05-06 03:09:08
【问题描述】:

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

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

假设我有一个名为 testEverything 的套件,其中包含这些规格 openApp,signIn,checkUser,logout。如果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();

    });

  });

});

如何退出整个测试?

【问题讨论】:

    标签: jasmine protractor exit e2e-testing


    【解决方案1】:

    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

    【讨论】:

    • 我知道,问题是我不希望我的测试因第一个失败的期望而保释,而是在我决定错误是否严重时手动(登录失败,注册失败等)或不(显示错误的用户名)。
    • 您的脚本将按照您的指示去做,它无法自行思考。当您认为合适时手动停止测试的唯一方法是按下Control + C 键。您的问题询问如果步骤失败如何停止测试,这是我回答的模块可以做的。也许我没有正确理解你的问题。
    • “我想知道的是,如果我可以让 Protractor 退出该 catch 函数中的整个套件...”,我有一个用于期望语句的异步包装器当期望失败时将拒绝承诺链。正如我特别说过的,当我捕捉到那些被拒绝的承诺时,我想手动退出测试(以防这些承诺返回的错误代码仅报告严重错误)。这才是真正的问题。
    【解决方案2】:

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

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

    (function () {
    
      global.bail = false;
    
    })();
    
    exports.config: { ...
    

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

    我还为我需要的 Jasmine 匹配器编写了异步包装器,它将执行 expect 表达式,然后进行比较,并返回一个承诺(使用 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 全局变量。我最终编写了一个库(非常小),将故障区分为关键和非关键,然后使用它,只有在发生严重故障时才会停止规范。

    【讨论】:

    • 不得不走到这一步真是太可悲了……我想我会让我的依赖任务失败,因为我不想添加那么多样板代码。我有完全相同的问题,我很惊讶没有本地方法可以做到这一点。
    • @Joffrey 我知道代码是否太长而无法达到目的。这应该是 Protractor/Jasmine 的内置功能,因为它并不复杂。也许我们应该在他们的 Github 存储库中添加一个问题?
    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2019-09-22
    • 1970-01-01
    • 2014-03-08
    相关资源
    最近更新 更多