【问题标题】:casperJS - grunt-casper: Running multiple Test-Suites in a loopcasperJS - grunt-casper:循环运行多个测试套件
【发布时间】:2015-10-29 07:32:50
【问题描述】:

准备

您好,我正在将 CasperJS 与 grunt-casper (github.com/iamchrismiller/grunt-casper) 结合使用,以便在我们的 GUI 开发过程中运行自动化功能和回归测试以进行验证。

我们像这样使用它,gruntfile.js中的casper runner:

casper: {
      componentTests: {
        options: {
          args: ['--ssl-protocol=any', '--ignore-ssl-errors=true', '--web-security=no'],
          test: true,
          includes: ['tests/testutils/testutils.js']
        },
        files: {
          'tests/testruns/logfiles/<%= grunt.template.today("yyyy-mm-dd-hhMMss") %>/componenttests/concat-testresults.xml': [
            'tests/functionaltests/componenttests/componentTestController.js']
         }
      },

所以在这里可以看出,我们通常只使用 SSL 参数运行 casper 测试,并在此处仅调用一个 Controllerclass,而不是列出单个测试(这是我的问题的根源之一)。 grunt-casper 提供了负责测试的对象,并且在每个 Controllerclass 中都包含并连接了测试......

...现在 componentTestController.js 如下所示:

var config = require('../../../testconfiguration');
var urls = config.test_styleguide_components.urls;
var viewportSizes = config.test_styleguide_components.viewportSizes;
var testfiles = config.test_styleguide_components.testfiles;
var tempCaptureFolder = 'tests/testruns/temprun/';
var testutils = new testutils();

var x = require('casper').selectXPath;

casper.test.begin('COMPONENT TEST CONTROLLER', function(test) {

  casper.start();

  /* Run tests for all given URLs */
  casper.each(urls, function(self, url, i) {

    casper.thenOpen(url, function() {

      /* Test different viewport resolutions for every URL */
      casper.each(viewportSizes, function(self, actViewport, j) {

        /* Reset the viewport */
        casper.then(function() {
          casper.viewport(actViewport[0], actViewport[1]);
        });

        /* Run the respective tests */
        casper.then(function() {

          /* Single tests for every resolution and link */
          casper.each(testfiles, function(self, actTest, k) {

            casper.then(function() {
              require('.'+actTest);
            });

          });

        });

      });

    });

  });

  casper.run(function() {
    test.done();
  });
});

在这里你可以看到我们运行了一个 3 级循环进行测试

  1. JSON 配置文件中给出的所有 URL,包含在字符串数组 ["url1.com","url2.com"....."urln.com"]
  2. 所有视口大小,以便每个 URL 在我们所需的视口分辨率中进行测试,以测试组件的正确责任行为
  3. ALL TESTFILES,所有的testfiles只包含一个TEST STUB什么意思,没有start,begin什么的,都在一个大的Testsourrounding中。

也许这已经很可笑并且可以以更好的方式完成,所以如果是这种情况,如果有人在这里提出建议,我会很高兴,但不要忘记 grunt-casper 作为跑步者参与其中。

问题

到目前为止,一切都很好,该工具总体上运行良好,我们构建的结构也可以按照我们的要求运行。但问题是,因为所有测试文件都在一个大的单一上下文中运行,一个失败的组件会使整个套件失败。

在正常情况下,这是我会支持的行为,但在我们的情况下,除了记录错误/使单个测试组件失败并继续运行之外,我没有看到任何合适的解决方案。

示例: 我运行了一个测试,就像上面和这部分中描述的那样设置:

          /* Single tests for every resolution and link */
          casper.each(testfiles, function(self, actTest, k) {

            casper.then(function() {
              require('.'+actTest);
            });

          });

我们包含 2 个如下所示的测试文件:

包含 testfile1.js

casper.then(function () {
  casper.waitForSelector(x("//a[normalize-space(text())='Atoms']"),
    function success() {
      casper.test.assertExists(x("//a[normalize-space(text())='Atoms']"));
      casper.click(x("//a[normalize-space(text())='Atoms']"));
    },
    function fail() {
      casper.test.assertExists(x("//a[normalize-space(text())='Atoms']"));
    });
});

包含 testfile2.js

casper.then(function () {
  casper.waitForSelector(x("//a[normalize-space(text())='Buttons']"),
    function success() {
      casper.test.assertExists(x("//a[normalize-space(text())='Buttons']"));
      casper.click(x("//a[normalize-space(text())='Buttons']"));
    },
    function fail() {
      testutils.createErrorScreenshot('#menu > li.active > ul > li:nth-child(7)', tempCaptureFolder, casper, 'BUTTONGROUPS#2-buttons-menu-does-not-exist.png');
      casper.test.assertExists(x("//a[normalize-space(text())='Buttons']"));
    });
});

因此,如果 testfile1.js 中的断言失败,那么一切都会失败。那么,即使第一次失败,我该如何继续使用 testfile2.js?这可以配置吗?能不能封装一下?

仅供参考,这不起作用: https://groups.google.com/d/msg/casperjs/3jlBIx96Tb8/RRPA9X8v6w4J

几乎相似的问题

我的问题在这里几乎是一样的: https://stackoverflow.com/a/27755205/4353553

这里的这个人几乎有另一种我尝试过的方法,但也遇到了他的问题,因为多个测试套件循环运行,出现问题: groups.google.com/forum/#!topic/casperjs/VrtkdGQl3FA

非常感谢您的建议

【问题讨论】:

    标签: node.js gruntjs casperjs


    【解决方案1】:

    希望我明白您的意思 - 有没有办法抑制失败的断言的异常抛出行为?

    Tester 的 assert 方法实际上允许覆盖在失败的断言上抛出异常的默认行为:

    var message = "This test will always fail, but never throw an exception and fail the whole suite.";
    test.assert(false, message, { doThrow: false });
    

    虽然不是所有的断言助手都有这个选项,我能想到的唯一其他解决方案是捕获异常:

    var message = "This test will always fail, but never throw an exception and fail the whole suite.";
    try {
      test.assertEquals(true, false, message);
    } catch (e) { /* Ignore thrown exception. */ }
    

    这两种方法都远非理想,因为在我们的案例中要求不要抛出所有断言。

    另一个需要覆盖 Tester 实例的核心断言方法的短期解决方案是(但仍然很老套):

    // Override the default assert method. Hopefully the test
    // casper property doesn't change between running suites.
    casper.test.assert =
    casper.test.assertTrue = (function () {
      // Save original assert.
      var __assert = casper.test.assert;
      return function (subject, message, context) {
        casper.log('Custom assert called!', 'debug');
        try {
          return __assert.apply(casper.test, arguments);
        }
        catch (error) {
          casper.test.processAssertionResult(error.result);
          return false;
        }
      };
    })();
    

    也就是说,我目前也在寻找针对这个“问题”的非侵入式解决方案(无法为doThrow 设置默认值)。以上是相对于我目前使用的 Casper JS 1.1-beta3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多