【问题标题】:Unable to get JSCover and PhantomJS to run Jasmine test on Cloudbees无法让 JSCover 和 PhantomJS 在 Cloudbees 上运行 Jasmine 测试
【发布时间】:2013-03-29 15:13:34
【问题描述】:

我目前正在尝试在 Web 服务器模式下运行 JSCover,以确定在 PhantomJS 无头浏览器中执行的 Jasmine 测试的覆盖范围。我也在使用 grunt+nodejs 来启动测试。

我在 gruntfile 中用来启动 JSCover 服务器并执行 phantomJS 的代码是:

// Start JSCover Server
var childProcess = require('child_process'),
var JSCOVER_PORT = "43287";
var JAVA_HOME = process.env.JAVA_HOME;

var jsCoverChildArgs = [
        "-jar", "src/js/test/tools/JSCover-all.jar",
        "-ws",
        "--branch",
        "--port="+JSCOVER_PORT,
        "--document-root=./",
        "--report-dir=target/",
        "--no-instrument=src/js/lib/",
        "--no-instrument=src/js/test/",
        "--no-instrument=src/js/test/lib/"
    ];

var jsCoverProc = childProcess.spawn(JAVA_HOME + "/bin/java", jsCoverChildArgs);

// Start PhantomJS
var phantomjs = require('phantomjs'),
var binPath = phantomjs.path,

var childArgs = [
        'src/js/test/lib/phantomjs_jasminexml_runner.js',
        'http://localhost:'+JSCOVER_PORT+'/src/js/test/SpecRunner.html',
        'target/surefire-reports'
    ];
runner = childProcess.execFile(binPath, childArgs);

runner.on('exit', function (code) {
    // Tests have finished, so clean up the process
    var success = (code === 0) ? true : false;
    jsCoverProc.kill(); // kill the JSCover server now that we are done with it

    done(success);
}); 

但是,当我在 cloudbees 中的 Jenkins 节点上运行 Web 服务器,然后针对它运行 phantomjs 时,我收到以下错误之一:

  • 一些测试开始运行,但随后进程失败:

    A spec : should be able to have a mock lo-dash ... 
    Warning: Task "test" failed. Use --force to continue.
    
    Aborted due to warnings.
    Build step 'Execute shell' marked build as failure
    Recording test results
    Finished: FAILURE
    
  • PhantomJS 无法访问 JSCover 服务器:

    Running "test" task
    phantomjs> Could not load 'http://127.0.0.1:43287/src/js/test/SpecRunner.html'.
    Warning: Task "test" failed. Use --force to continue.
    

对于第二个错误,我尝试使用我设置的不同端口和主机名(例如,127.0.0.1 或 localhost 用于主机名,4327、43287 等用于端口)。端口不是在构建时动态设置的 - 我在我的 grunt 脚本中对它们进行了硬编码。

对于为什么会发生上述错误或为什么我在 Cloudbees Jenkins 节点上运行和访问 JSCover 服务器时遇到问题(但从未在我的本地计算机上)有任何想法吗?

【问题讨论】:

  • 有没有办法配置 jscover 进程记录?我不知道这是由低速单核构建从属(与本地计算机相比)引起的并发问题,phantomJS 开始运行测试但 JSCover 服务器尚未完全启动

标签: jenkins jasmine phantomjs cloudbees jscoverage


【解决方案1】:

因此,当您对任何进程执行 JSCover 时,都需要一段时间才能启动。如果我们期望它早点启动,那么错误肯定会出现。

引自精彩文章:http://blog.johnryding.com/post/46757192364/javascript-code-coverage-with-phantomjs-jasmine-and

现在我有了一个满足我所有要求的代码覆盖率工具, 最后一部分是让这段代码作为我们 Jenkins 构建的一部分运行 (使用 grunt 脚本)。这很容易上手,但我 遇到了两个一直破坏我的构建的错误:

  1. 有时 phantomJS 无法连接到 JSCover 服务器
  2. 有时 phantomJS 会连接到服务器,但随后会在运行期间的某个随机点放弃执行我的测试。

这些都是非常奇怪的问题,只发生在我团队的 Jenkins 节点上并且难以诊断 - 尽管结果证明它们是简单的修复。

对于问题 1,该错误是由于我的 grunt 脚本在执行 phantomJS 之前没有等待 JSCover 启动的结果。

对于第二个问题,事实证明我的团队正在使用一个特殊的 jasmine 测试运行器来帮助在测试完成后生成 XML 文件。这个文件的问题是它有一个函数等待 Jasmine 完成它的执行,但是在它放弃运行测试之前使用了一个非常短的超时。这是 Jenkins + JSCover 的一个问题,因为测试需要更长的时间才能加载和运行,因为它们必须从 Web 服务器加载,而不是直接从文件系统加载。幸运的是,这个修复就像增加超时一样简单。

【讨论】:

  • 哈哈。所以有趣的是,我(OP)是这篇博文的作者,你打败了我回答我自己的问题。 :) 很高兴听到您喜欢我的文章!
  • 天啊..哈哈不能比这更好!很棒的文章兄弟!
【解决方案2】:

我会说你需要在生成 JSCover 后等待一段时间 - 过去我在生成时使用 webdriver 完成了一些事情,然后等待它可用(理想情况下,你可以寻找响应并休眠,重复,直到生成的进程准备好)。

即在继续之前从 127.0.0.1:43287 查找有效的 http 响应(“有效”表示服务器已启动)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多