【发布时间】: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 级循环进行测试
- JSON 配置文件中给出的所有 URL,包含在字符串数组 ["url1.com","url2.com"....."urln.com"] 中
- 所有视口大小,以便每个 URL 在我们所需的视口分辨率中进行测试,以测试组件的正确责任行为
- 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
非常感谢您的建议
【问题讨论】: